This commit is contained in:
Phil Ringnalda 2015-05-23 14:42:08 -07:00
Родитель 8ee2d56439 17cba2818f
Коммит 0421a842b0
730 изменённых файлов: 12899 добавлений и 7997 удалений

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

@ -22,4 +22,4 @@
# changes to stick? As of bug 928195, this shouldn't be necessary! Please
# don't change CLOBBER for WebIDL changes any more.
Bug 1163201 needs clobber.
Bug 1166031 - NSS update hit needs-clobber bustage.

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

@ -31,12 +31,15 @@ GetNativeFromGeckoAccessible(mozilla::a11y::Accessible* aAccessible)
return native;
}
// This is OR'd with the Accessible owner to indicate the wrap-ee is a proxy.
static const uintptr_t IS_PROXY = 1;
@interface mozAccessible : NSObject <mozAccessible>
{
/**
* Weak reference; it owns us.
*/
mozilla::a11y::AccessibleWrap* mGeckoAccessible;
uintptr_t mGeckoAccessible;
/**
* Strong ref to array of children
@ -54,6 +57,9 @@ GetNativeFromGeckoAccessible(mozilla::a11y::Accessible* aAccessible)
mozilla::a11y::role mRole;
}
// return the Accessible for this mozAccessible.
- (mozilla::a11y::AccessibleWrap*) getGeckoAccessible;
// inits with the gecko owner.
- (id)initWithAccessible:(mozilla::a11y::AccessibleWrap*)geckoParent;

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

@ -65,7 +65,7 @@ GetClosestInterestingAccessible(id anObject)
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
if ((self = [super init])) {
mGeckoAccessible = geckoAccessible;
mGeckoAccessible = reinterpret_cast<uintptr_t>(geckoAccessible);
mRole = geckoAccessible->Role();
}
@ -83,6 +83,15 @@ GetClosestInterestingAccessible(id anObject)
NS_OBJC_END_TRY_ABORT_BLOCK;
}
- (mozilla::a11y::AccessibleWrap*)getGeckoAccessible
{
// Check if mGeckoAccessible points at a proxy
if (mGeckoAccessible & IS_PROXY)
return nil;
return reinterpret_cast<AccessibleWrap*>(mGeckoAccessible);
}
#pragma mark -
@ -92,8 +101,10 @@ GetClosestInterestingAccessible(id anObject)
// unknown (either unimplemented, or irrelevant) elements are marked as ignored
// as well as expired elements.
return !mGeckoAccessible || ([[self role] isEqualToString:NSAccessibilityUnknownRole] &&
!(mGeckoAccessible->InteractiveState() & states::FOCUSABLE));
AccessibleWrap* accWrap = [self getGeckoAccessible];
return !accWrap || ([[self role] isEqualToString:NSAccessibilityUnknownRole] &&
!(accWrap->InteractiveState() & states::FOCUSABLE));
NS_OBJC_END_TRY_ABORT_BLOCK_RETURN(NO);
}
@ -103,7 +114,7 @@ GetClosestInterestingAccessible(id anObject)
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
// if we're expired, we don't support any attributes.
if (!mGeckoAccessible)
if (![self getGeckoAccessible])
return [NSArray array];
static NSArray *generalAttributes = nil;
@ -141,7 +152,7 @@ GetClosestInterestingAccessible(id anObject)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
if (!mGeckoAccessible)
if (![self getGeckoAccessible])
return nil;
#if DEBUG
@ -183,7 +194,8 @@ GetClosestInterestingAccessible(id anObject)
if ([attribute isEqualToString:NSAccessibilityTitleAttribute])
return [self title];
if ([attribute isEqualToString:NSAccessibilityTitleUIElementAttribute]) {
Relation rel = mGeckoAccessible->RelationByType(RelationType::LABELLED_BY);
Relation rel =
[self getGeckoAccessible]->RelationByType(RelationType::LABELLED_BY);
Accessible* tempAcc = rel.Next();
return tempAcc ? GetNativeFromGeckoAccessible(tempAcc) : nil;
}
@ -227,7 +239,8 @@ GetClosestInterestingAccessible(id anObject)
- (id)accessibilityHitTest:(NSPoint)point
{
if (!mGeckoAccessible)
AccessibleWrap* accWrap = [self getGeckoAccessible];
if (!accWrap)
return nil;
// Convert the given screen-global point in the cocoa coordinate system (with
@ -239,8 +252,9 @@ GetClosestInterestingAccessible(id anObject)
nsIntPoint geckoPoint = nsCocoaUtils::
CocoaPointsToDevPixels(tmpPoint, nsCocoaUtils::GetBackingScaleFactor(mainView));
Accessible* child = mGeckoAccessible->ChildAtPoint(geckoPoint.x, geckoPoint.y,
Accessible::eDeepestChild);
Accessible* child =
accWrap->ChildAtPoint(geckoPoint.x, geckoPoint.y,
Accessible::eDeepestChild);
if (child) {
mozAccessible* nativeChild = GetNativeFromGeckoAccessible(child);
@ -270,10 +284,11 @@ GetClosestInterestingAccessible(id anObject)
- (id)accessibilityFocusedUIElement
{
if (!mGeckoAccessible)
AccessibleWrap* accWrap = [self getGeckoAccessible];
if (!accWrap)
return nil;
Accessible* focusedGeckoChild = mGeckoAccessible->FocusedChild();
Accessible* focusedGeckoChild = accWrap->FocusedChild();
if (focusedGeckoChild) {
mozAccessible *focusedChild = GetNativeFromGeckoAccessible(focusedGeckoChild);
if (focusedChild)
@ -290,7 +305,8 @@ GetClosestInterestingAccessible(id anObject)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
Accessible* accessibleParent = mGeckoAccessible->GetUnignoredParent();
AccessibleWrap* accWrap = [self getGeckoAccessible];
Accessible* accessibleParent = accWrap->GetUnignoredParent();
if (accessibleParent) {
id nativeParent = GetNativeFromGeckoAccessible(accessibleParent);
if (nativeParent)
@ -303,7 +319,7 @@ GetClosestInterestingAccessible(id anObject)
//
// get the native root accessible, and tell it to return its first parent unignored accessible.
id nativeParent =
GetNativeFromGeckoAccessible(mGeckoAccessible->RootAccessible());
GetNativeFromGeckoAccessible(accWrap->RootAccessible());
NSAssert1 (nativeParent, @"!!! we can't find a parent for %@", self);
return GetClosestInterestingAccessible(nativeParent);
@ -332,14 +348,15 @@ GetClosestInterestingAccessible(id anObject)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
if (mChildren || !mGeckoAccessible->AreChildrenCached())
AccessibleWrap* accWrap = [self getGeckoAccessible];
if (mChildren || !accWrap->AreChildrenCached())
return mChildren;
mChildren = [[NSMutableArray alloc] init];
// get the array of children.
nsAutoTArray<Accessible*, 10> childrenArray;
mGeckoAccessible->GetUnignoredChildren(&childrenArray);
accWrap->GetUnignoredChildren(&childrenArray);
// now iterate through the children array, and get each native accessible.
uint32_t totalCount = childrenArray.Length();
@ -370,10 +387,11 @@ GetClosestInterestingAccessible(id anObject)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
if (!mGeckoAccessible)
AccessibleWrap* accWrap = [self getGeckoAccessible];
if (!accWrap)
return nil;
nsIntRect rect = mGeckoAccessible->Bounds();
nsIntRect rect = accWrap->Bounds();
NSScreen* mainView = [[NSScreen screens] objectAtIndex:0];
CGFloat scaleFactor = nsCocoaUtils::GetBackingScaleFactor(mainView);
@ -389,10 +407,11 @@ GetClosestInterestingAccessible(id anObject)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
if (!mGeckoAccessible)
AccessibleWrap* accWrap = [self getGeckoAccessible];
if (!accWrap)
return nil;
nsIntRect rect = mGeckoAccessible->Bounds();
nsIntRect rect = accWrap->Bounds();
CGFloat scaleFactor =
nsCocoaUtils::GetBackingScaleFactor([[NSScreen screens] objectAtIndex:0]);
return [NSValue valueWithSize:NSMakeSize(static_cast<CGFloat>(rect.width) / scaleFactor,
@ -403,11 +422,12 @@ GetClosestInterestingAccessible(id anObject)
- (NSString*)role
{
if (!mGeckoAccessible)
AccessibleWrap* accWrap = [self getGeckoAccessible];
if (!accWrap)
return nil;
#ifdef DEBUG_A11Y
NS_ASSERTION(nsAccUtils::IsTextInterfaceSupportCorrect(mGeckoAccessible),
NS_ASSERTION(nsAccUtils::IsTextInterfaceSupportCorrect(accWrap),
"Does not support Text when it should");
#endif
@ -427,10 +447,11 @@ GetClosestInterestingAccessible(id anObject)
- (NSString*)subrole
{
if (!mGeckoAccessible)
AccessibleWrap* accWrap = [self getGeckoAccessible];
if (!accWrap)
return nil;
nsIAtom* landmark = mGeckoAccessible->LandmarkRole();
nsIAtom* landmark = accWrap->LandmarkRole();
if (landmark) {
if (landmark == nsGkAtoms::application)
return @"AXLandmarkApplication";
@ -457,7 +478,7 @@ GetClosestInterestingAccessible(id anObject)
return @"AXContentList"; // 10.6+ NSAccessibilityContentListSubrole;
case roles::ENTRY:
if (mGeckoAccessible->IsSearchbox())
if (accWrap->IsSearchbox())
return @"AXSearchField";
break;
@ -528,7 +549,7 @@ struct RoleDescrComparator
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
nsAutoString title;
mGeckoAccessible->Name(title);
[self getGeckoAccessible]->Name(title);
return nsCocoaUtils::ToNSString(title);
NS_OBJC_END_TRY_ABORT_BLOCK_NIL;
@ -539,7 +560,7 @@ struct RoleDescrComparator
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
nsAutoString value;
mGeckoAccessible->Value(value);
[self getGeckoAccessible]->Value(value);
return nsCocoaUtils::ToNSString(value);
NS_OBJC_END_TRY_ABORT_BLOCK_NIL;
@ -567,11 +588,12 @@ struct RoleDescrComparator
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
if (mGeckoAccessible->IsDefunct())
AccessibleWrap* accWrap = [self getGeckoAccessible];
if (accWrap->IsDefunct())
return nil;
nsAutoString desc;
mGeckoAccessible->Description(desc);
accWrap->Description(desc);
return nsCocoaUtils::ToNSString(desc);
@ -583,7 +605,7 @@ struct RoleDescrComparator
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
nsAutoString helpText;
mGeckoAccessible->Help(helpText);
[self getGeckoAccessible]->Help(helpText);
return nsCocoaUtils::ToNSString(helpText);
NS_OBJC_END_TRY_ABORT_BLOCK_NIL;
@ -601,26 +623,29 @@ struct RoleDescrComparator
- (BOOL)isFocused
{
return FocusMgr()->IsFocused(mGeckoAccessible);
return FocusMgr()->IsFocused([self getGeckoAccessible]);
}
- (BOOL)canBeFocused
{
return mGeckoAccessible && (mGeckoAccessible->InteractiveState() & states::FOCUSABLE);
AccessibleWrap* accWrap = [self getGeckoAccessible];
return accWrap && (accWrap->InteractiveState() & states::FOCUSABLE);
}
- (BOOL)focus
{
if (!mGeckoAccessible)
AccessibleWrap* accWrap = [self getGeckoAccessible];
if (!accWrap)
return NO;
mGeckoAccessible->TakeFocus();
accWrap->TakeFocus();
return YES;
}
- (BOOL)isEnabled
{
return mGeckoAccessible && ((mGeckoAccessible->InteractiveState() & states::UNAVAILABLE) == 0);
AccessibleWrap* accWrap = [self getGeckoAccessible];
return accWrap && ((accWrap->InteractiveState() & states::UNAVAILABLE) == 0);
}
// The root accessible calls this when the focused node was
@ -643,7 +668,7 @@ struct RoleDescrComparator
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
AccessibleWrap* accWrap = static_cast<AccessibleWrap*>(mGeckoAccessible);
AccessibleWrap* accWrap = [self getGeckoAccessible];
// Get a pointer to the native window (NSWindow) we reside in.
NSWindow *nativeWindow = nil;
@ -685,14 +710,14 @@ struct RoleDescrComparator
[self invalidateChildren];
mGeckoAccessible = nullptr;
mGeckoAccessible = 0;
NS_OBJC_END_TRY_ABORT_BLOCK;
}
- (BOOL)isExpired
{
return !mGeckoAccessible;
return ![self getGeckoAccessible];
}
#pragma mark -

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

@ -73,7 +73,7 @@ enum CheckboxValue {
- (BOOL)accessibilityIsIgnored
{
return !mGeckoAccessible;
return ![self getGeckoAccessible];
}
- (NSArray*)accessibilityActionNames
@ -118,12 +118,13 @@ enum CheckboxValue {
{
// both buttons and checkboxes have only one action. we should really stop using arbitrary
// arrays with actions, and define constants for these actions.
mGeckoAccessible->DoAction(0);
[self getGeckoAccessible]->DoAction(0);
}
- (BOOL)isTab
{
return (mGeckoAccessible && (mGeckoAccessible->Role() == roles::PAGETAB));
AccessibleWrap* accWrap = [self getGeckoAccessible];
return (accWrap && (accWrap->Role() == roles::PAGETAB));
}
@end
@ -148,7 +149,7 @@ enum CheckboxValue {
- (int)isChecked
{
uint64_t state = mGeckoAccessible->NativeState();
uint64_t state = [self getGeckoAccessible]->NativeState();
// check if we're checked or in a mixed state
if (state & states::CHECKED) {
@ -292,10 +293,10 @@ enum CheckboxValue {
*/
- (id)value
{
if (!mGeckoAccessible)
if (![self getGeckoAccessible])
return nil;
Accessible* accessible = mGeckoAccessible->GetSelectedItem(0);
Accessible* accessible = [self getGeckoAccessible]->GetSelectedItem(0);
if (!accessible)
return nil;
@ -339,29 +340,29 @@ enum CheckboxValue {
- (NSUInteger)accessibilityArrayAttributeCount:(NSString*)attribute
{
if (!mGeckoAccessible)
if (![self getGeckoAccessible])
return 0;
// By default this calls -[[mozAccessible children] count].
// Since we don't cache mChildren. This is faster.
if ([attribute isEqualToString:NSAccessibilityChildrenAttribute])
return mGeckoAccessible->ChildCount() ? 1 : 0;
return [self getGeckoAccessible]->ChildCount() ? 1 : 0;
return [super accessibilityArrayAttributeCount:attribute];
}
- (NSArray*)children
{
if (!mGeckoAccessible)
if (![self getGeckoAccessible])
return nil;
nsDeckFrame* deckFrame = do_QueryFrame(mGeckoAccessible->GetFrame());
nsDeckFrame* deckFrame = do_QueryFrame([self getGeckoAccessible]->GetFrame());
nsIFrame* selectedFrame = deckFrame ? deckFrame->GetSelectedBox() : nullptr;
Accessible* selectedAcc = nullptr;
if (selectedFrame) {
nsINode* node = selectedFrame->GetContent();
selectedAcc = mGeckoAccessible->Document()->GetAccessible(node);
selectedAcc = [self getGeckoAccessible]->Document()->GetAccessible(node);
}
if (selectedAcc) {

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

@ -33,7 +33,7 @@ getNativeViewFromRootAccessible(Accessible* aAccessible)
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
// if we're expired, we don't support any attributes.
if (!mGeckoAccessible)
if (![self getGeckoAccessible])
return [NSArray array];
// standard attributes that are shared and supported by root accessible (AXMain) elements.
@ -95,7 +95,7 @@ getNativeViewFromRootAccessible(Accessible* aAccessible)
if (mParallelView)
return (id)mParallelView;
mParallelView = getNativeViewFromRootAccessible (mGeckoAccessible);
mParallelView = getNativeViewFromRootAccessible ([self getGeckoAccessible]);
NSAssert(mParallelView, @"can't return root accessible's native parallel view.");
return mParallelView;

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

@ -20,17 +20,19 @@
mozilla::ErrorResult rv;
// XXX use the flattening API when there are available
// see bug 768298
mGeckoAccessible->GetContent()->GetTextContent(title, rv);
[self getGeckoAccessible]->GetContent()->GetTextContent(title, rv);
return nsCocoaUtils::ToNSString(title);
}
- (id)value
{
if (!mGeckoAccessible || !mGeckoAccessible->IsHyperText())
AccessibleWrap* accWrap = [self getGeckoAccessible];
if (!accWrap || !accWrap->IsHyperText())
return nil;
uint32_t level = mGeckoAccessible->AsHyperText()->GetLevelInternal();
uint32_t level = accWrap->AsHyperText()->GetLevelInternal();
return [NSNumber numberWithInt:level];
}
@ -45,7 +47,7 @@
- (NSArray*)accessibilityAttributeNames
{
// if we're expired, we don't support any attributes.
if (!mGeckoAccessible)
if (![self getGeckoAccessible])
return [NSArray array];
static NSMutableArray* attributes = nil;
@ -69,7 +71,7 @@
- (NSArray*)accessibilityActionNames
{
// if we're expired, we don't support any attributes.
if (!mGeckoAccessible)
if (![self getGeckoAccessible])
return [NSArray array];
static NSArray* actionNames = nil;
@ -84,11 +86,13 @@
- (void)accessibilityPerformAction:(NSString*)action
{
if (!mGeckoAccessible)
AccessibleWrap* accWrap = [self getGeckoAccessible];
if (!accWrap)
return;
if ([action isEqualToString:NSAccessibilityPressAction])
mGeckoAccessible->DoAction(0);
accWrap->DoAction(0);
else
[super accessibilityPerformAction:action];
}
@ -105,11 +109,11 @@
- (NSURL*)url
{
if (!mGeckoAccessible || mGeckoAccessible->IsDefunct())
if (![self getGeckoAccessible] || [self getGeckoAccessible]->IsDefunct())
return nil;
nsAutoString value;
mGeckoAccessible->Value(value);
[self getGeckoAccessible]->Value(value);
NSString* urlString = value.IsEmpty() ? nil : nsCocoaUtils::ToNSString(value);
if (!urlString)

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

@ -8,9 +8,6 @@
@interface mozTextAccessible : mozAccessible
{
// both of these are the same old mGeckoAccessible, but already
// QI'd for us, to the right type, for convenience.
mozilla::a11y::HyperTextAccessible* mGeckoTextAccessible; // strong
}
@end

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

@ -53,21 +53,9 @@ ToNSString(id aValue)
@implementation mozTextAccessible
- (id)initWithAccessible:(AccessibleWrap*)accessible
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
if ((self = [super initWithAccessible:accessible])) {
mGeckoTextAccessible = accessible->AsHyperText();
}
return self;
NS_OBJC_END_TRY_ABORT_BLOCK_NIL;
}
- (BOOL)accessibilityIsIgnored
{
return !mGeckoAccessible;
return ![self getGeckoAccessible];
}
- (NSArray*)accessibilityAttributeNames
@ -126,11 +114,13 @@ ToNSString(id aValue)
return [self text];
}
AccessibleWrap* accWrap = [self getGeckoAccessible];
if ([attribute isEqualToString:@"AXRequired"])
return [NSNumber numberWithBool:!!(mGeckoAccessible->State() & states::REQUIRED)];
return [NSNumber numberWithBool:!!(accWrap->State() & states::REQUIRED)];
if ([attribute isEqualToString:@"AXInvalid"])
return [NSNumber numberWithBool:!!(mGeckoAccessible->State() & states::INVALID)];
return [NSNumber numberWithBool:!!(accWrap->State() & states::INVALID)];
if ([attribute isEqualToString:NSAccessibilityVisibleCharacterRangeAttribute])
return [self visibleCharacterRange];
@ -166,7 +156,9 @@ ToNSString(id aValue)
- (id)accessibilityAttributeValue:(NSString*)attribute forParameter:(id)parameter
{
if (!mGeckoTextAccessible)
AccessibleWrap* accWrap = [self getGeckoAccessible];
HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
if (!textAcc)
return nil;
if ([attribute isEqualToString:NSAccessibilityStringForRangeParameterizedAttribute]) {
@ -214,7 +206,7 @@ ToNSString(id aValue)
int32_t start = range.location;
int32_t end = start + range.length;
nsIntRect bounds = mGeckoTextAccessible->TextBounds(start, end);
nsIntRect bounds = textAcc->TextBounds(start, end);
return [NSValue valueWithRect:nsCocoaUtils::GeckoRectToCocoaRect(bounds)];
}
@ -247,7 +239,9 @@ ToNSString(id aValue)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
if (!mGeckoTextAccessible)
AccessibleWrap* accWrap = [self getGeckoAccessible];
HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
if (!textAcc)
return;
if ([attribute isEqualToString:NSAccessibilityValueAttribute]) {
@ -262,12 +256,12 @@ ToNSString(id aValue)
return;
int32_t start = 0, end = 0;
mGeckoTextAccessible->SelectionBoundsAt(0, &start, &end);
mGeckoTextAccessible->DeleteText(start, end - start);
textAcc->SelectionBoundsAt(0, &start, &end);
textAcc->DeleteText(start, end - start);
nsString text;
nsCocoaUtils::GetStringForNSString(stringValue, text);
mGeckoTextAccessible->InsertText(text, start);
textAcc->InsertText(text, start);
}
if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute]) {
@ -275,8 +269,8 @@ ToNSString(id aValue)
if (!ToNSRange(value, &range))
return;
mGeckoTextAccessible->SetSelectionBoundsAt(0, range.location,
range.location + range.length);
textAcc->SetSelectionBoundsAt(0, range.location,
range.location + range.length);
return;
}
@ -285,8 +279,8 @@ ToNSString(id aValue)
if (!ToNSRange(value, &range))
return;
mGeckoTextAccessible->ScrollSubstringTo(range.location, range.location + range.length,
nsIAccessibleScrollType::SCROLL_TYPE_TOP_EDGE);
textAcc->ScrollSubstringTo(range.location, range.location + range.length,
nsIAccessibleScrollType::SCROLL_TYPE_TOP_EDGE);
return;
}
@ -303,16 +297,6 @@ ToNSString(id aValue)
return nil;
}
- (void)expire
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
mGeckoTextAccessible = nullptr;
[super expire];
NS_OBJC_END_TRY_ABORT_BLOCK;
}
#pragma mark -
- (BOOL)isReadOnly
@ -322,8 +306,10 @@ ToNSString(id aValue)
if ([[self role] isEqualToString:NSAccessibilityStaticTextRole])
return YES;
if (mGeckoTextAccessible)
return (mGeckoAccessible->State() & states::READONLY) == 0;
AccessibleWrap* accWrap = [self getGeckoAccessible];
HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
if (textAcc)
return (accWrap->State() & states::READONLY) == 0;
return NO;
@ -332,8 +318,10 @@ ToNSString(id aValue)
- (NSNumber*)caretLineNumber
{
int32_t lineNumber = mGeckoTextAccessible ?
mGeckoTextAccessible->CaretLineNumber() - 1 : -1;
AccessibleWrap* accWrap = [self getGeckoAccessible];
HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
int32_t lineNumber = textAcc ?
textAcc->CaretLineNumber() - 1 : -1;
return (lineNumber >= 0) ? [NSNumber numberWithInt:lineNumber] : nil;
}
@ -342,10 +330,12 @@ ToNSString(id aValue)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
if (mGeckoTextAccessible) {
AccessibleWrap* accWrap = [self getGeckoAccessible];
HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
if (textAcc) {
nsString text;
nsCocoaUtils::GetStringForNSString(aNewString, text);
mGeckoTextAccessible->ReplaceText(text);
textAcc->ReplaceText(text);
}
NS_OBJC_END_TRY_ABORT_BLOCK;
@ -353,7 +343,9 @@ ToNSString(id aValue)
- (NSString*)text
{
if (!mGeckoAccessible || !mGeckoTextAccessible)
AccessibleWrap* accWrap = [self getGeckoAccessible];
HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
if (!accWrap || !textAcc)
return nil;
// A password text field returns an empty value
@ -361,9 +353,7 @@ ToNSString(id aValue)
return @"";
nsAutoString text;
mGeckoTextAccessible->TextSubstring(0,
nsIAccessibleText::TEXT_OFFSET_END_OF_TEXT,
text);
textAcc->TextSubstring(0, nsIAccessibleText::TEXT_OFFSET_END_OF_TEXT, text);
return nsCocoaUtils::ToNSString(text);
}
@ -371,10 +361,12 @@ ToNSString(id aValue)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_RETURN;
if (!mGeckoAccessible || !mGeckoTextAccessible)
AccessibleWrap* accWrap = [self getGeckoAccessible];
HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
if (!accWrap || !textAcc)
return 0;
return mGeckoTextAccessible ? mGeckoTextAccessible->CharacterCount() : 0;
return textAcc ? textAcc->CharacterCount() : 0;
NS_OBJC_END_TRY_ABORT_BLOCK_RETURN(0);
}
@ -383,9 +375,11 @@ ToNSString(id aValue)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_RETURN;
if (mGeckoTextAccessible) {
AccessibleWrap* accWrap = [self getGeckoAccessible];
HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
if (textAcc) {
int32_t start = 0, end = 0;
mGeckoTextAccessible->SelectionBoundsAt(0, &start, &end);
textAcc->SelectionBoundsAt(0, &start, &end);
return (end - start);
}
return 0;
@ -397,12 +391,14 @@ ToNSString(id aValue)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
if (mGeckoTextAccessible) {
AccessibleWrap* accWrap = [self getGeckoAccessible];
HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
if (textAcc) {
int32_t start = 0, end = 0;
mGeckoTextAccessible->SelectionBoundsAt(0, &start, &end);
textAcc->SelectionBoundsAt(0, &start, &end);
if (start != end) {
nsAutoString selText;
mGeckoTextAccessible->TextSubstring(start, end, selText);
textAcc->TextSubstring(start, end, selText);
return nsCocoaUtils::ToNSString(selText);
}
}
@ -415,17 +411,19 @@ ToNSString(id aValue)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
if (mGeckoTextAccessible) {
AccessibleWrap* accWrap = [self getGeckoAccessible];
HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
if (textAcc) {
int32_t start = 0;
int32_t end = 0;
int32_t count = mGeckoTextAccessible->SelectionCount();
int32_t count = textAcc->SelectionCount();
if (count) {
mGeckoTextAccessible->SelectionBoundsAt(0, &start, &end);
textAcc->SelectionBoundsAt(0, &start, &end);
return [NSValue valueWithRange:NSMakeRange(start, end - start)];
}
start = mGeckoTextAccessible->CaretOffset();
start = textAcc->CaretOffset();
return [NSValue valueWithRange:NSMakeRange(start != -1 ? start : 0, 0)];
}
return [NSValue valueWithRange:NSMakeRange(0, 0)];
@ -437,9 +435,11 @@ ToNSString(id aValue)
{
// XXX this won't work with Textarea and such as we actually don't give
// the visible character range.
AccessibleWrap* accWrap = [self getGeckoAccessible];
HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
return [NSValue valueWithRange:
NSMakeRange(0, mGeckoTextAccessible ?
mGeckoTextAccessible->CharacterCount() : 0)];
NSMakeRange(0, textAcc ?
textAcc->CharacterCount() : 0)];
}
- (void)valueDidChange
@ -460,11 +460,16 @@ ToNSString(id aValue)
- (NSString*)stringFromRange:(NSRange*)range
{
NS_PRECONDITION(mGeckoTextAccessible && range, "no Gecko text accessible or range");
NS_PRECONDITION(range, "no range");
AccessibleWrap* accWrap = [self getGeckoAccessible];
HyperTextAccessible* textAcc = accWrap? accWrap->AsHyperText() : nullptr;
if (!textAcc)
return nil;
nsAutoString text;
mGeckoTextAccessible->TextSubstring(range->location,
range->location + range->length, text);
textAcc->TextSubstring(range->location,
range->location + range->length, text);
return nsCocoaUtils::ToNSString(text);
}
@ -496,18 +501,20 @@ ToNSString(id aValue)
- (NSString*)text
{
if (!mGeckoAccessible)
AccessibleWrap* accWrap = [self getGeckoAccessible];
if (!accWrap)
return nil;
return nsCocoaUtils::ToNSString(mGeckoAccessible->AsTextLeaf()->Text());
return nsCocoaUtils::ToNSString(accWrap->AsTextLeaf()->Text());
}
- (long)textLength
{
if (!mGeckoAccessible)
AccessibleWrap* accWrap = [self getGeckoAccessible];
if (!accWrap)
return 0;
return mGeckoAccessible->AsTextLeaf()->Text().Length();
return accWrap->AsTextLeaf()->Text().Length();
}
@end

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

@ -35,19 +35,14 @@ function readURI(uri, options) {
options = options || {};
let charset = options.charset || 'UTF-8';
let channel = NetUtil.newChannel2(uri,
charset,
null,
null, // aLoadingNode
Services.scriptSecurityManager.getSystemPrincipal(),
null, // aTriggeringPrincipal
Ci.nsILoadInfo.SEC_NORMAL,
Ci.nsIContentPolicy.TYPE_OTHER);
let channel = NetUtil.newChannel({
uri: NetUtil.newURI(uri, charset),
loadUsingSystemPrincipal: true});
let { promise, resolve, reject } = defer();
try {
NetUtil.asyncFetch2(channel, function (stream, result) {
NetUtil.asyncFetch(channel, function (stream, result) {
if (components.isSuccessCode(result)) {
let count = stream.available();
let data = NetUtil.readInputStreamToString(stream, count, { charset : charset });
@ -83,14 +78,9 @@ exports.readURI = readURI;
function readURISync(uri, charset) {
charset = typeof charset === "string" ? charset : "UTF-8";
let channel = NetUtil.newChannel2(uri,
charset,
null,
null, // aLoadingNode
Services.scriptSecurityManager.getSystemPrincipal(),
null, // aTriggeringPrincipal
Ci.nsILoadInfo.SEC_NORMAL,
Ci.nsIContentPolicy.TYPE_OTHER);
let channel = NetUtil.newChannel({
uri: NetUtil.newURI(uri, charset),
loadUsingSystemPrincipal: true});
let stream = channel.open();
let count = stream.available();

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

@ -152,20 +152,28 @@ function URL(url, base) {
Object.defineProperties(this, {
toString: {
value() new String(uri.spec).toString(),
value() {
return new String(uri.spec).toString();
},
enumerable: false
},
valueOf: {
value() new String(uri.spec).valueOf(),
value() {
return new String(uri.spec).valueOf();
},
enumerable: false
},
toSource: {
value() new String(uri.spec).toSource(),
value() {
return new String(uri.spec).toSource();
},
enumerable: false
},
// makes more sense to flatten to string, easier to travel across JSON
toJSON: {
value() new String(uri.spec).toString(),
value() {
return new String(uri.spec).toString();
},
enumerable: false
}
});

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

@ -178,14 +178,10 @@ function readURI(uri) {
uri = proto.resolveURI(nsURI);
}
let stream = NetUtil.newChannel2(uri,
'UTF-8',
null,
null, // aLoadingNode
systemPrincipal,
null, // aTriggeringPrincipal
Ci.nsILoadInfo.SEC_NORMAL,
Ci.nsIContentPolicy.TYPE_OTHER).open();
let stream = NetUtil.newChannel({
uri: NetUtil.newURI(uri, 'UTF-8'),
loadUsingSystemPrincipal: true}
).open();
let count = stream.available();
let data = NetUtil.readInputStreamToString(stream, count, {
charset: 'UTF-8'

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

@ -88,7 +88,6 @@ pref("network.http.max-persistent-connections-per-proxy", 20);
pref("network.cookie.cookieBehavior", 0);
// spdy
pref("network.http.spdy.enabled.http2draft", true);
pref("network.http.spdy.push-allowance", 32768);
// See bug 545869 for details on why these are set the way they are

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

@ -1,5 +1,5 @@
<?xml version="1.0"?>
<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1428708782000">
<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1432051555000">
<emItems>
<emItem blockID="i58" id="webmaster@buzzzzvideos.info">
<versionRange minVersion="0" maxVersion="*">
@ -2970,6 +2970,30 @@
<match name="filename" exp="(NPSWF32.*\.dll)|(Flash\ Player\.plugin)" /> <versionRange minVersion="13.0.0.263" maxVersion="13.0.0.268" severity="0" vulnerabilitystatus="1"></versionRange>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
</pluginItem>
<pluginItem blockID="p902">
<match name="filename" exp="JavaAppletPlugin\.plugin" /> <versionRange minVersion="Java 7 Update 45" maxVersion="Java 7 Update 78" severity="0" vulnerabilitystatus="1"></versionRange>
<infoURL>https://java.com/</infoURL>
</pluginItem>
<pluginItem blockID="p904">
<match name="filename" exp="JavaAppletPlugin\.plugin" /> <versionRange minVersion="Java 8" maxVersion="Java 8 Update 44" severity="0" vulnerabilitystatus="1"></versionRange>
<infoURL>https://java.com/</infoURL>
</pluginItem>
<pluginItem blockID="p906">
<match name="name" exp="Java\(TM\) Platform SE 7 U(4[5-9]|(5|6)\d|7[0-8])(\s[^\d\._U]|$)" /> <match name="filename" exp="npjp2\.dll" /> <versionRange severity="0" vulnerabilitystatus="1"></versionRange>
<infoURL>https://java.com/</infoURL>
</pluginItem>
<pluginItem blockID="p908">
<match name="name" exp="Java\(TM\) Platform SE 8( U([1-3]?\d|4[0-4]))?(\s[^\d\._U]|$)" /> <match name="filename" exp="npjp2\.dll" /> <versionRange severity="0" vulnerabilitystatus="1"></versionRange>
<infoURL>https://java.com/</infoURL>
</pluginItem>
<pluginItem blockID="p910">
<match name="name" exp="Java(\(TM\))? Plug-in 10\.(4[5-9]|(5|6)\d|7[0-8])(\.[0-9]+)?([^\d\._]|$)" /> <match name="filename" exp="libnpjp2\.so" /> <versionRange severity="0" vulnerabilitystatus="1"></versionRange>
<infoURL>https://java.com/</infoURL>
</pluginItem>
<pluginItem blockID="p912">
<match name="name" exp="Java(\(TM\))? Plug-in 11\.(\d|[1-3]\d|4[0-4])(\.[0-9]+)?([^\d\._]|$)" /> <match name="filename" exp="libnpjp2\.so" /> <versionRange severity="0" vulnerabilitystatus="1"></versionRange>
<infoURL>https://java.com/</infoURL>
</pluginItem>
</pluginItems>
<gfxItems>

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

@ -1704,6 +1704,7 @@ pref("shumway.swf.whitelist", "http://g-ecx.images-amazon.com/*/AiryBasicRendere
pref("image.mem.max_decoded_image_kb", 256000);
pref("loop.enabled", true);
pref("loop.textChat.enabled", false);
pref("loop.server", "https://loop.services.mozilla.com/v0");
pref("loop.seenToS", "unseen");
pref("loop.showPartnerLogo", true);
@ -1779,19 +1780,11 @@ pref("geo.wifi.uri", "https://location.services.mozilla.com/v1/geolocate?key=%MO
#endif
#ifdef XP_MACOSX
#ifdef RELEASE_BUILD
pref("geo.provider.use_corelocation", false);
#else
pref("geo.provider.use_corelocation", true);
#endif
#endif
#ifdef XP_WIN
#ifdef RELEASE_BUILD
pref("geo.provider.ms-windows-location", false);
#else
pref("geo.provider.ms-windows-location", true);
#endif
#endif
// Necko IPC security checks only needed for app isolation for cookies/cache/etc:

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

@ -46,13 +46,14 @@
}
function parseQueryString() {
let searchParams = new URLSearchParams(location.href.split("?")[1]);
let searchParams = new URLSearchParams(document.documentURI.split("?")[1]);
let mode = searchParams.get("mode");
config.directory = searchParams.get("directory");
config.origin = searchParams.get("origin");
let encodedURL = searchParams.get("url");
let url = decodeURIComponent(encodedURL);
if (config.directory) {
// directory does not have origin set, in that case use the url origin for
// the error message.
if (!config.origin) {
let URI = Services.io.newURI(url, null, null);
config.origin = Services.scriptSecurityManager.getNoAppCodebasePrincipal(URI).origin;
}

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

@ -218,7 +218,15 @@ let LoopUI;
// Add observer notifications before the service is initialized
Services.obs.addObserver(this, "loop-status-changed", false);
this.MozLoopService.initialize();
// This is a promise for test purposes, but we don't want to be logging
// expected errors to the console, so we catch them here.
this.MozLoopService.initialize().catch(ex => {
if (!ex.message ||
(!ex.message.contains("not enabled") &&
!ex.message.contains("not needed"))) {
console.error(ex);
}
});
this.updateToolbarState();
},

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

@ -400,7 +400,7 @@
#ifndef XP_MACOSX
class="menuitem-iconic"
#endif
oncommand="window.pktUI.openTabWithUrl(Pocket.listURL);"/>
oncommand="openUILink(Pocket.listURL, event);"/>
<menuseparator id="menu_pocketSeparator"/>
<menuitem id="menu_bookmarkThisPage"
command="Browser:AddBookmarkAs"

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

@ -60,6 +60,9 @@ SocialUI = {
if (this._initialized) {
return;
}
let mm = window.getGroupMessageManager("social");
mm.loadFrameScript("chrome://browser/content/content.js", true);
mm.loadFrameScript("chrome://browser/content/social-content.js", true);
Services.obs.addObserver(this, "social:ambient-notification-changed", false);
Services.obs.addObserver(this, "social:profile-changed", false);
@ -154,7 +157,7 @@ SocialUI = {
break;
case "social:frameworker-error":
if (this.enabled && SocialSidebar.provider && SocialSidebar.provider.origin == data) {
SocialSidebar.setSidebarErrorMessage();
SocialSidebar.loadFrameworkerFailure();
}
break;
case "nsPref:changed":
@ -351,21 +354,21 @@ SocialFlyout = {
if (!SocialUI.enabled || panel.firstChild)
return;
// create and initialize the panel for this window
let iframe = document.createElement("iframe");
let iframe = document.createElement("browser");
iframe.setAttribute("type", "content");
iframe.setAttribute("class", "social-panel-frame");
iframe.setAttribute("flex", "1");
iframe.setAttribute("message", "true");
iframe.setAttribute("messagemanagergroup", "social");
iframe.setAttribute("tooltip", "aHTMLTooltip");
iframe.setAttribute("context", "contentAreaContextMenu");
iframe.setAttribute("origin", SocialSidebar.provider.origin);
panel.appendChild(iframe);
},
setFlyoutErrorMessage: function SF_setFlyoutErrorMessage() {
this.iframe.removeAttribute("src");
this.iframe.webNavigation.loadURI("about:socialerror?mode=compactInfo&origin=" +
encodeURIComponent(this.iframe.getAttribute("origin")),
null, null, null, null);
sizeSocialPanelToContent(this.panel, this.iframe);
// the xbl bindings for the iframe probably don't exist yet, so we can't
// access iframe.messageManager directly - but can get at it with this dance.
let mm = iframe.QueryInterface(Components.interfaces.nsIFrameLoaderOwner).frameLoader.messageManager;
mm.sendAsyncMessage("Social:SetErrorURL", null,
{ template: "about:socialerror?mode=compactInfo&origin=%{origin}" });
},
unload: function() {
@ -374,8 +377,6 @@ SocialFlyout = {
if (!panel.firstChild)
return
let iframe = panel.firstChild;
if (iframe.socialErrorListener)
iframe.socialErrorListener.remove();
panel.removeChild(iframe);
},
@ -383,8 +384,7 @@ SocialFlyout = {
let panel = this.panel;
let iframe = this.iframe;
this._dynamicResizer = new DynamicResizeWatcher();
iframe.docShell.isActive = true;
iframe.docShell.isAppTab = true;
iframe.docShellIsActive = true;
if (iframe.contentDocument.readyState == "complete") {
this._dynamicResizer.start(panel, iframe);
this.dispatchPanelEvent("socialFrameShow");
@ -405,7 +405,7 @@ SocialFlyout = {
onHidden: function(aEvent) {
this._dynamicResizer.stop();
this._dynamicResizer = null;
this.iframe.docShell.isActive = false;
this.iframe.docShellIsActive = false;
this.dispatchPanelEvent("socialFrameHide");
},
@ -423,7 +423,6 @@ SocialFlyout = {
iframe.removeEventListener("load", documentLoaded, true);
cb();
}, true);
Social.setErrorListener(iframe, SocialFlyout.setFlyoutErrorMessage.bind(SocialFlyout))
iframe.setAttribute("src", aURL);
} else {
// we still need to set the src to trigger the contents hashchange event
@ -503,11 +502,13 @@ SocialShare = {
iframe.setAttribute("tooltip", "aHTMLTooltip");
iframe.setAttribute("disableglobalhistory", "true");
iframe.setAttribute("flex", "1");
iframe.setAttribute("message", "true");
iframe.setAttribute("messagemanagergroup", "social");
panel.lastChild.appendChild(iframe);
iframe.addEventListener("load", function _firstload() {
iframe.removeEventListener("load", _firstload, true);
iframe.messageManager.loadFrameScript("chrome://browser/content/content.js", true);
}, true);
let mm = iframe.QueryInterface(Components.interfaces.nsIFrameLoaderOwner).frameLoader.messageManager;
mm.sendAsyncMessage("Social:SetErrorURL", null,
{ template: "about:socialerror?mode=compactInfo&origin=%{origin}&url=%{url}" });
this.populateProviderMenu();
},
@ -596,23 +597,6 @@ SocialShare = {
}
},
setErrorMessage: function() {
let iframe = this.iframe;
if (!iframe)
return;
let url;
let origin = iframe.getAttribute("origin");
if (!origin) {
// directory site is down
url = "about:socialerror?mode=tryAgainOnly&directory=1&url=" + encodeURIComponent(iframe.getAttribute("src"));
} else {
url = "about:socialerror?mode=compactInfo&origin=" + encodeURIComponent(origin);
}
iframe.webNavigation.loadURI(url, null, null, null, null);
sizeSocialPanelToContent(this.panel, iframe);
},
sharePage: function(providerOrigin, graphData, target) {
// if providerOrigin is undefined, we use the last-used provider, or the
// current/default provider. The provider selection in the share panel
@ -694,8 +678,7 @@ SocialShare = {
let endpointMatch = shareEndpoint == iframe.getAttribute("src");
if (endpointMatch) {
this._dynamicResizer.start(iframe.parentNode, iframe, size);
iframe.docShell.isActive = true;
iframe.docShell.isAppTab = true;
iframe.docShellIsActive = true;
let evt = iframe.contentDocument.createEvent("CustomEvent");
evt.initCustomEvent("OpenGraphData", true, true, JSON.stringify(pageData));
iframe.contentDocument.documentElement.dispatchEvent(evt);
@ -704,8 +687,7 @@ SocialShare = {
// first time load, wait for load and dispatch after load
iframe.addEventListener("load", function panelBrowserOnload(e) {
iframe.removeEventListener("load", panelBrowserOnload, true);
iframe.docShell.isActive = true;
iframe.docShell.isAppTab = true;
iframe.docShellIsActive = true;
iframe.parentNode.removeAttribute("loading");
// to support standard share endpoints mimick window.open by setting
// window.opener, some share endpoints rely on w.opener to know they
@ -764,7 +746,6 @@ SocialShare = {
_openPanel: function() {
let anchor = document.getAnonymousElementByAttribute(this.anchor, "class", "toolbarbutton-icon");
this.panel.openPopup(anchor, "bottomcenter topright", 0, 0, false, false);
Social.setErrorListener(this.iframe, this.setErrorMessage.bind(this));
Services.telemetry.getHistogramById("SOCIAL_TOOLBAR_BUTTONS").add(0);
}
};
@ -918,19 +899,12 @@ SocialSidebar = {
}
} else {
sbrowser.setAttribute("origin", this.provider.origin);
if (this.provider.errorState == "frameworker-error") {
SocialSidebar.setSidebarErrorMessage();
return;
}
// Make sure the right sidebar URL is loaded
if (sbrowser.getAttribute("src") != this.provider.sidebarURL) {
// we check readyState right after setting src, we need a new content
// viewer to ensure we are checking against the correct document.
sbrowser.docShell.createAboutBlankContentViewer(null);
Social.setErrorListener(sbrowser, this.setSidebarErrorMessage.bind(this));
// setting isAppTab causes clicks on untargeted links to open new tabs
sbrowser.docShell.isAppTab = true;
sbrowser.setAttribute("src", this.provider.sidebarURL);
PopupNotifications.locationChange(sbrowser);
}
@ -976,18 +950,13 @@ SocialSidebar = {
_unloadTimeoutId: 0,
setSidebarErrorMessage: function() {
let sbrowser = document.getElementById("social-sidebar-browser");
// a frameworker error "trumps" a sidebar error.
let origin = sbrowser.getAttribute("origin");
if (origin) {
origin = "&origin=" + encodeURIComponent(origin);
}
if (this.provider.errorState == "frameworker-error") {
sbrowser.setAttribute("src", "about:socialerror?mode=workerFailure" + origin);
} else {
let url = encodeURIComponent(this.provider.sidebarURL);
sbrowser.loadURI("about:socialerror?mode=tryAgain&url=" + url + origin, null, null);
loadFrameworkerFailure: function() {
if (this.provider && this.provider.errorState == "frameworker-error") {
// we have to explicitly load this error page since it is not being
// handled via the normal error page paths.
let sbrowser = document.getElementById("social-sidebar-browser");
sbrowser.setAttribute("src", "about:socialerror?mode=workerFailure&origin=" +
encodeURIComponent(this.provider.origin));
}
},
@ -1298,8 +1267,6 @@ SocialStatus = {
_onclose: function(frame) {
frame.removeEventListener("close", this._onclose, true);
frame.removeEventListener("click", this._onclick, true);
if (frame.socialErrorListener)
frame.socialErrorListener.remove();
},
_onclick: function() {
@ -1316,29 +1283,28 @@ SocialStatus = {
(frame) => {
frame.addEventListener("close", () => { SocialStatus._onclose(frame) }, true);
frame.addEventListener("click", this._onclick, true);
Social.setErrorListener(frame, this.setPanelErrorMessage.bind(this));
});
Services.telemetry.getHistogramById("SOCIAL_TOOLBAR_BUTTONS").add(1);
},
setPanelErrorMessage: function(aNotificationFrame) {
if (!aNotificationFrame)
return;
let src = aNotificationFrame.getAttribute("src");
aNotificationFrame.removeAttribute("src");
let origin = aNotificationFrame.getAttribute("origin");
aNotificationFrame.webNavigation.loadURI("about:socialerror?mode=tryAgainOnly&url=" +
encodeURIComponent(src) + "&origin=" +
encodeURIComponent(origin),
null, null, null, null);
let panel = aNotificationFrame.parentNode;
sizeSocialPanelToContent(panel, aNotificationFrame);
},
}
};
let SocialMarksWidgetListener = {
onWidgetAdded: function(aWidgetId, aArea, aPosition) {
let node = document.getElementById(aWidgetId);
if (!node || !node.classList.contains("social-mark-button"))
return;
node._receiveMessage = node.receiveMessage.bind(node);
messageManager.addMessageListener("Social:ErrorPageNotify", node._receiveMessage);
},
onWidgetBeforeDOMChange: function(aNode, aNextNode, aContainer, isRemoval) {
if (!isRemoval || !aNode || !aNode.classList.contains("social-mark-button"))
return;
messageManager.removeMessageListener("Social:ErrorPageNotify", aNode._receiveMessage);
delete aNode._receiveMessage;
}
}
/**
* SocialMarks
*
@ -1442,7 +1408,9 @@ SocialMarks = {
get _toolbarHelper() {
delete this._toolbarHelper;
this._toolbarHelper = new ToolbarHelper("social-mark-button", CreateSocialMarkWidget);
this._toolbarHelper = new ToolbarHelper("social-mark-button",
CreateSocialMarkWidget,
SocialMarksWidgetListener);
return this._toolbarHelper;
},

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

@ -1033,6 +1033,9 @@ chatbox:-moz-full-screen-ancestor > .chat-titlebar {
/* Combobox dropdown renderer */
#ContentSelectDropdown > menupopup {
max-height: 350px;
/* The menupopup itself should always be rendered LTR to ensure the scrollbar aligns with
* the dropdown arrow on the dropdown widget. If a menuitem is RTL, its style will be set accordingly */
direction: ltr;
}
.contentSelectDropdown-optgroup {

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

@ -1223,6 +1223,8 @@
<browser id="social-sidebar-browser"
type="content"
context="contentAreaContextMenu"
message="true"
messagemanagergroup="social"
disableglobalhistory="true"
tooltip="aHTMLTooltip"
popupnotificationanchor="social-sidebar-favico"

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

@ -375,6 +375,12 @@ let ClickEventHandler = {
bookmark: false, referrerPolicy: ownerDoc.referrerPolicy };
if (href) {
try {
BrowserUtils.urlSecurityCheck(href, node.ownerDocument.nodePrincipal);
} catch (e) {
return;
}
json.href = href;
if (node) {
json.title = node.getAttribute("title");

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

@ -247,6 +247,7 @@ input[type=button] {
.newtab-title {
left: 0;
padding: 0 4px;
}
.newtab-sponsored {

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

@ -217,7 +217,10 @@ let gPage = {
for (let site of gGrid.sites) {
if (site) {
site.captureIfMissing();
// The site may need to modify and/or re-render itself if
// something changed after newtab was created by preloader.
// For example, the suggested tile endTime may have passed.
site.onFirstVisible();
}
}

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

@ -136,10 +136,32 @@ Site.prototype = {
return newTabString("suggested.button", [targetedName]);
},
/**
* Checks for and modifies link at campaign end time
*/
_checkLinkEndTime: function Site_checkLinkEndTime() {
if (this.link.endTime && this.link.endTime < Date.now()) {
let oldUrl = this.url;
// chop off the path part from url
this.link.url = Services.io.newURI(this.url, null, null).resolve("/");
// clear supplied images - this triggers thumbnail download for new url
delete this.link.imageURI;
delete this.link.enhancedImageURI;
// remove endTime to avoid further time checks
delete this.link.endTime;
// clear enhanced-content image that may still exist in preloaded page
this._querySelector(".enhanced-content").style.backgroundImage = "";
gPinnedLinks.replace(oldUrl, this.link);
}
},
/**
* Renders the site's data (fills the HTML fragment).
*/
_render: function Site_render() {
// first check for end time, as it may modify the link
this._checkLinkEndTime();
// setup display variables
let enhanced = gAllPages.enhanced && DirectoryLinksProvider.getEnhancedLink(this.link);
let url = this.url;
let title = enhanced && enhanced.title ? enhanced.title :
@ -174,6 +196,21 @@ Site.prototype = {
this.refreshThumbnail();
},
/**
* Called when the site's tab becomes visible for the first time.
* Since the newtab may be preloaded long before it's displayed,
* check for changed conditions and re-render if needed
*/
onFirstVisible: function Site_onFirstVisible() {
if (this.link.endTime && this.link.endTime < Date.now()) {
// site needs to change landing url and background image
this._render();
}
else {
this.captureIfMissing();
}
},
/**
* Captures the site's thumbnail in the background, but only if there's no
* existing thumbnail and the page allows background captures.

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

@ -1433,13 +1433,13 @@ nsContextMenu.prototype = {
var clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].
getService(Ci.nsIClipboardHelper);
clipboard.copyString(addresses, document);
clipboard.copyString(addresses);
},
copyLink: function() {
var clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].
getService(Ci.nsIClipboardHelper);
clipboard.copyString(this.linkURL, document);
clipboard.copyString(this.linkURL);
},
///////////////
@ -1691,7 +1691,7 @@ nsContextMenu.prototype = {
copyMediaLocation : function () {
var clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].
getService(Ci.nsIClipboardHelper);
clipboard.copyString(this.mediaURL, document);
clipboard.copyString(this.mediaURL);
},
drmLearnMore: function(aEvent) {

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

@ -1253,7 +1253,7 @@ function doCopy()
elem.removeAttribute("copybuffer");
}
}
gClipboardHelper.copyString(text.join("\n"), document);
gClipboardHelper.copyString(text.join("\n"));
}
}

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

@ -0,0 +1,105 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* This content script should work in any browser or iframe and should not
* depend on the frame being contained in tabbrowser. */
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
// social frames are always treated as app tabs
docShell.isAppTab = true;
// Error handling class used to listen for network errors in the social frames
// and replace them with a social-specific error page
SocialErrorListener = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener,
Ci.nsISupportsWeakReference,
Ci.nsISupports]),
defaultTemplate: "about:socialerror?mode=tryAgainOnly&url=%{url}&origin=%{origin}",
urlTemplate: null,
init() {
addMessageListener("Social:SetErrorURL", this);
let webProgress = docShell.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIWebProgress);
webProgress.addProgressListener(this, Ci.nsIWebProgress.NOTIFY_STATE_REQUEST |
Ci.nsIWebProgress.NOTIFY_LOCATION);
},
receiveMessage(message) {
switch(message.name) {
case "Social:SetErrorURL": {
// either a url or null to reset to default template
this.urlTemplate = message.objects.template;
}
}
},
setErrorPage() {
// if this is about:providerdirectory, use the directory iframe
let frame = docShell.chromeEventHandler;
let origin = frame.getAttribute("origin");
let src = frame.getAttribute("src");
if (src == "about:providerdirectory") {
frame = content.document.getElementById("activation-frame");
src = frame.getAttribute("src");
}
let url = this.urlTemplate || this.defaultTemplate;
url = url.replace("%{url}", encodeURIComponent(src));
url = url.replace("%{origin}", encodeURIComponent(origin));
if (frame != docShell.chromeEventHandler) {
// Unable to access frame.docShell here. This is our own frame and doesn't
// provide reload, so we'll just set the src.
frame.setAttribute("src", url);
} else {
let webNav = docShell.QueryInterface(Ci.nsIWebNavigation);
webNav.loadURI(url, null, null, null, null);
}
sendAsyncMessage("Social:ErrorPageNotify", {
origin: origin,
url: src
});
},
onStateChange(aWebProgress, aRequest, aState, aStatus) {
let failure = false;
if ((aState & Ci.nsIWebProgressListener.STATE_STOP)) {
if (aRequest instanceof Ci.nsIHttpChannel) {
try {
// Change the frame to an error page on 4xx (client errors)
// and 5xx (server errors). responseStatus throws if it is not set.
failure = aRequest.responseStatus >= 400 &&
aRequest.responseStatus < 600;
} catch (e) {
failure = aStatus != Components.results.NS_OK;
}
}
}
// Calling cancel() will raise some OnStateChange notifications by itself,
// so avoid doing that more than once
if (failure && aStatus != Components.results.NS_BINDING_ABORTED) {
aRequest.cancel(Components.results.NS_BINDING_ABORTED);
this.setErrorPage();
}
},
onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {
if (aRequest && aFlags & Ci.nsIWebProgressListener.LOCATION_CHANGE_ERROR_PAGE) {
aRequest.cancel(Components.results.NS_BINDING_ABORTED);
this.setErrorPage();
}
},
onProgressChange() {},
onStatusChange() {},
onSecurityChange() {},
};
SocialErrorListener.init();

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

@ -30,6 +30,8 @@
<xul:browser anonid="content" class="chat-frame" flex="1"
context="contentAreaContextMenu"
disableglobalhistory="true"
message="true"
messagemanagergroup="social"
tooltip="aHTMLTooltip"
xbl:inherits="src,origin" type="content"/>
</content>
@ -72,13 +74,6 @@
this._deferredChatLoaded.resolve(this);
}, true);
// load content.js to support webrtc, fullscreen, etc.
this.addEventListener("load", function loaded(event) {
this.removeEventListener("load", loaded, true);
let mm = this.content.messageManager;
mm.loadFrameScript("chrome://browser/content/content.js", true);
}, true);
if (this.src)
this.setAttribute("src", this.src);
]]></constructor>
@ -141,10 +136,10 @@
<property name="isActive">
<getter>
return this.content.docShell.isActive;
return this.content.docShellIsActive;
</getter>
<setter>
this.content.docShell.isActive = !!val;
this.content.docShellIsActive = !!val;
// let the chat frame know if it is being shown or hidden
let evt = this.contentDocument.createEvent("CustomEvent");

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

@ -54,6 +54,8 @@
iframe.setAttribute("type", "content");
iframe.setAttribute("class", "social-panel-frame");
iframe.setAttribute("flex", "1");
iframe.setAttribute("message", "true");
iframe.setAttribute("messagemanagergroup", "social");
iframe.setAttribute("tooltip", "aHTMLTooltip");
iframe.setAttribute("context", "contentAreaContextMenu");
iframe.setAttribute("origin", provider.origin);
@ -134,6 +136,15 @@
]]></body>
</method>
<method name="receiveMessage">
<parameter name="message"/>
<body><![CDATA[
if (message.name != "Social:ErrorPageNotify" || message.target != this.content)
return;
this.openPanel();
]]></body>
</method>
<method name="loadPanel">
<parameter name="pageData"/>
<parameter name="target"/>
@ -206,37 +217,16 @@
let unload = () => {
contentWindow.removeEventListener("unload", unload);
contentWindow.removeEventListener("socialMarkUpdate", markUpdate);
if (this.content.socialErrorListener)
this.content.socialErrorListener.remove();
}
contentWindow.addEventListener("socialMarkUpdate", markUpdate);
contentWindow.addEventListener("unload", unload);
}
this.content.addEventListener("DOMContentLoaded", DOMContentLoaded, true);
Social.setErrorListener(this.content, this.setErrorMessage.bind(this));
this._loading = true;
this.content.setAttribute("src", endpoint);
]]></body>
</method>
<method name="setErrorMessage">
<parameter name="aNotificationFrame"/>
<body><![CDATA[
if (!aNotificationFrame)
return;
let src = aNotificationFrame.getAttribute("src");
aNotificationFrame.removeAttribute("src");
let origin = aNotificationFrame.getAttribute("origin");
aNotificationFrame.webNavigation.loadURI("about:socialerror?mode=tryAgainOnly&url=" +
encodeURIComponent(src) + "&origin=" +
encodeURIComponent(origin),
null, null, null, null);
// ensure the panel is open if error occurs on first click
this.openPanel();
]]></body>
</method>
<method name="openPanel">
<parameter name="aResetOnClose"/>
<body><![CDATA[

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

@ -5,14 +5,7 @@ Cu.import("resource://gre/modules/NetUtil.jsm");
function test() {
var file = new File([new Blob(['test'], {type: 'text/plain'})], "test-name");
var url = URL.createObjectURL(file);
var channel = NetUtil.newChannel2(url,
null,
null,
null, // aLoadingNode
Services.scriptSecurityManager.getSystemPrincipal(),
null, // aTriggeringPrincipal
Ci.nsILoadInfo.SEC_NORMAL,
Ci.nsIContentPolicy.TYPE_OTHER);
var channel = NetUtil.newChannel({uri: url, loadUsingSystemPrincipal: true});
is(channel.contentDispositionFilename, 'test-name', "filename matches");
}

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

@ -32,7 +32,7 @@ function test() {
// Put a multi-line string in the clipboard.
// Setting the clipboard value is an async OS operation, so we need to poll
// the clipboard for valid data before going on.
waitForClipboard(kTestString, function() { cbHelper.copyString(kTestString, document); },
waitForClipboard(kTestString, function() { cbHelper.copyString(kTestString); },
next_test, finish);
}

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

@ -14,7 +14,7 @@ add_task(function* () {
SimpleTest.waitForClipboard(url, () => {
Components.classes["@mozilla.org/widget/clipboardhelper;1"]
.getService(Components.interfaces.nsIClipboardHelper)
.copyString(url, document);
.copyString(url);
}, resolve, () => {
ok(false, "Clipboard copy failed");
reject();

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

@ -1,6 +1,8 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
const {TabStateFlusher} = Cu.import("resource:///modules/sessionstore/TabStateFlusher.jsm", {});
const DUMMY = "http://example.com/browser/browser/base/content/test/general/dummy_page.html";
function getMinidumpDirectory() {
@ -86,7 +88,7 @@ let restart = Task.async(function*(browser) {
return browser;
// Make sure the main process has all of the current tab state before crashing
TabState.flush(browser);
yield TabStateFlusher.flush(browser);
browser.messageManager.sendAsyncMessage("Test:Crash");
yield promiseWaitForEvent(browser, "AboutTabCrashedLoad", false, true);

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

@ -1,5 +1,7 @@
"use strict";
const {TabStateFlusher} = Cu.import("resource:///modules/sessionstore/TabStateFlusher.jsm", {});
add_task(function*() {
let uri = "http://example.com/browser/browser/base/content/test/general/dummy_page.html";
@ -10,7 +12,7 @@ add_task(function*() {
let tab = gBrowser.addTab();
tab.linkedBrowser.loadURI(uri);
yield BrowserTestUtils.browserLoaded(tab.linkedBrowser);
TabState.flush(tab.linkedBrowser);
yield TabStateFlusher.flush(tab.linkedBrowser);
let key = tab.linkedBrowser.permanentKey;
let win = gBrowser.replaceTabWithWindow(tab);

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

@ -1,4 +1,4 @@
<svg width="640px" height="480px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0">
<svg width="640px" height="480px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>This is a root SVG element's title</title>
<foreignObject>
<html xmlns="http://www.w3.org/1999/xhtml">

До

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

После

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

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

@ -46,3 +46,4 @@ support-files =
[browser_newtab_undo.js]
[browser_newtab_unpin.js]
[browser_newtab_update.js]
[browser_newtab_bug1145428.js]

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

@ -0,0 +1,88 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/*
* These tests make sure that pinning suggested tile results in:
* - making suggested tile a history tile and replacing enhancedImageURI with imageURI
* - upond end of campaign, replaces landing url with baseDomain and switches
* background image to thumbnail
*/
gDirectorySource = "data:application/json," + JSON.stringify({
"suggested": [{
url: "http://example.com/landing/page.html",
imageURI: "data:image/png;base64,helloWORLD3",
enhancedImageURI: "data:image/png;base64,helloWORLD2",
title: "title",
type: "affiliate",
frecent_sites: ["example0.com"],
}]
});
function runTests() {
let origGetFrecentSitesName = DirectoryLinksProvider.getFrecentSitesName;
DirectoryLinksProvider.getFrecentSitesName = () => "";
function getData(cellNum) {
let cell = getCell(cellNum);
if (!cell.site)
return null;
let siteNode = cell.site.node;
return {
type: siteNode.getAttribute("type"),
thumbnail: siteNode.querySelector(".newtab-thumbnail").style.backgroundImage,
enhanced: siteNode.querySelector(".enhanced-content").style.backgroundImage,
title: siteNode.querySelector(".newtab-title").textContent,
suggested: siteNode.getAttribute("suggested"),
url: siteNode.querySelector(".newtab-link").getAttribute("href"),
};
}
yield setLinks("0,1,2,3,4,5,6,7,8,9");
setPinnedLinks("");
yield addNewTabPageTab();
// load another newtab since the first may not get suggested tile
yield addNewTabPageTab();
checkGrid("http://example.com/landing/page.html,0,1,2,3,4,5,6,7,8,9");
// evaluate suggested tile
let tileData = getData(0);
is(tileData.type, "affiliate", "unpinned type");
is(tileData.thumbnail, "url(\"data:image/png;base64,helloWORLD3\")", "unpinned thumbnail");
is(tileData.enhanced, "url(\"data:image/png;base64,helloWORLD2\")", "unpinned enhanced");
is(tileData.suggested, "true", "has suggested set", "unpinned suggested exists");
is(tileData.url, "http://example.com/landing/page.html", "unpinned landing page");
// suggested tile should not be pinned
is(NewTabUtils.pinnedLinks.isPinned({url: "http://example.com/landing/page.html"}), false, "suggested tile is not pinned");
// pin suggested tile
whenPagesUpdated();
let siteNode = getCell(0).node.querySelector(".newtab-site");
let pinButton = siteNode.querySelector(".newtab-control-pin");
EventUtils.synthesizeMouseAtCenter(pinButton, {}, getContentWindow());
// wait for whenPagesUpdated
yield null;
// tile should be pinned and turned into history tile
is(NewTabUtils.pinnedLinks.isPinned({url: "http://example.com/landing/page.html"}), true, "suggested tile is pinned");
tileData = getData(0);
is(tileData.type, "history", "pinned type");
is(tileData.suggested, null, "no suggested attribute");
is(tileData.url, "http://example.com/landing/page.html", "original landing page");
// set pinned tile endTime into past and reload the page
NewTabUtils.pinnedLinks._links[0].endTime = Date.now() - 1000;
yield addNewTabPageTab();
// check that url is reset to base domain and thumbnail points to moz-page-thumb service
is(NewTabUtils.pinnedLinks.isPinned({url: "http://example.com/"}), true, "baseDomain url is pinned");
tileData = getData(0);
is(tileData.type, "history", "type is history");
is(tileData.title, "example.com", "title changed to baseDomain");
is(tileData.thumbnail.indexOf("moz-page-thumb") != -1, true, "thumbnail contains moz-page-thumb");
is(tileData.enhanced, "", "no enhanced image");
is(tileData.url, "http://example.com/", "url points to baseDomian");
DirectoryLinksProvider.getFrecentSitesName = origGetFrecentSitesName;
}

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

@ -159,6 +159,7 @@ function runTests() {
suggestedLink.adgroup_name = "Technology";
Services.prefs.setCharPref(PREF_NEWTAB_DIRECTORYSOURCE,
"data:application/json," + JSON.stringify({"suggested": [suggestedLink]}));
yield watchLinksChangeOnce().then(TestRunner.next);
yield addNewTabPageTab();
({type, enhanced, title, suggested} = getData(0));
@ -170,6 +171,7 @@ function runTests() {
suggestedLink.explanation = "Suggested for %1$S enthusiasts who visit sites like %2$S";
Services.prefs.setCharPref(PREF_NEWTAB_DIRECTORYSOURCE,
"data:application/json," + encodeURIComponent(JSON.stringify({"suggested": [suggestedLink]})));
yield watchLinksChangeOnce().then(TestRunner.next);
yield addNewTabPageTab();
({type, enhanced, title, suggested} = getData(0));
@ -181,6 +183,7 @@ function runTests() {
delete suggestedLink.adgroup_name;
Services.prefs.setCharPref(PREF_NEWTAB_DIRECTORYSOURCE,
"data:application/json," + encodeURIComponent(JSON.stringify({"suggested": [suggestedLink]})));
yield watchLinksChangeOnce().then(TestRunner.next);
yield addNewTabPageTab();
({type, enhanced, title, suggested} = getData(0));

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

@ -41,20 +41,27 @@ function runTests() {
yield null;
yield null;
whenPagesUpdated();
// Click the pin button on the link in the 1th tile spot
let siteNode = getCell(1).node.querySelector(".newtab-site");
let pinButton = siteNode.querySelector(".newtab-control-pin");
expected.action = "pin";
// tiles become "history" when pinned
expected.type = "history";
expected.pinned = true;
EventUtils.synthesizeMouseAtCenter(pinButton, {}, getContentWindow());
// Wait for reportSitesAction
// Wait for whenPagesUpdated and reportSitesAction
yield null;
yield null;
// Unpin that link
expected.action = "unpin";
expected.pinned = false;
whenPagesUpdated();
// need to reget siteNode for it could have been re-rendered after pin
siteNode = getCell(1).node.querySelector(".newtab-site");
pinButton = siteNode.querySelector(".newtab-control-pin");
EventUtils.synthesizeMouseAtCenter(pinButton, {}, getContentWindow());
// Wait for whenPagesUpdated and reportSitesAction
@ -75,7 +82,7 @@ function runTests() {
yield null;
// Click the 1th link now in the 0th tile spot
expected.type = "sponsored";
expected.type = "history";
expected.action = "click";
EventUtils.synthesizeMouseAtCenter(siteNode, {}, getContentWindow());

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

@ -34,7 +34,7 @@ skip-if = e10s && debug # Leaking docshells (bug 1150147)
[browser_share.js]
skip-if = true # bug 1115131
[browser_social_activation.js]
skip-if = e10s # Bug 933103 synthesizeMouseAtCenter not e10s friendly
skip-if = e10s && debug # e10s/Linux/Debug Leaking docshells (bug 1150147)
[browser_social_chatwindow.js]
[browser_social_chatwindow_resize.js]
[browser_social_chatwindowfocus.js]

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

@ -62,12 +62,7 @@ function addTab(url, callback) {
function sendActivationEvent(tab, callback, nullManifest) {
// hack Social.lastEventReceived so we don't hit the "too many events" check.
Social.lastEventReceived = 0;
let doc = tab.linkedBrowser.contentDocument;
// if our test has a frame, use it
if (doc.defaultView.frames[0])
doc = doc.defaultView.frames[0].document;
let button = doc.getElementById(nullManifest ? "activation-old" : "activation");
EventUtils.synthesizeMouseAtCenter(button, {}, doc.defaultView);
BrowserTestUtils.synthesizeMouseAtCenter("#activation", {}, tab.linkedBrowser);
executeSoon(callback);
}
@ -117,24 +112,22 @@ function clickAddonRemoveButton(tab, aCallback) {
AddonManager.getAddonsByTypes(["service"], function(aAddons) {
let addon = aAddons[0];
let doc = tab.linkedBrowser.contentDocument;
let doc = tab.linkedBrowser.contentDocument;;
let list = doc.getElementById("addon-list");
let item = getAddonItemInList(addon.id, list);
isnot(item, null, "Should have found the add-on in the list");
var button = doc.getAnonymousElementByAttribute(item, "anonid", "remove-btn");
let button = item._removeBtn;
isnot(button, null, "Should have a remove button");
ok(!button.disabled, "Button should not be disabled");
EventUtils.synthesizeMouseAtCenter(button, { }, doc.defaultView);
// uninstall happens after about:addons tab is closed, so we wait on
// disabled
promiseObserverNotified("social:provider-disabled").then(() => {
is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling");
executeSoon(function() { aCallback(addon); });
});
// Force XBL to apply
item.clientTop;
is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling");
executeSoon(function() { aCallback(addon); });
BrowserTestUtils.synthesizeMouseAtCenter(button, {}, tab.linkedBrowser);
});
}

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

@ -62,17 +62,17 @@ var tests = {
testSidebar: function(next) {
let sbrowser = document.getElementById("social-sidebar-browser");
onSidebarLoad(function() {
ok(sbrowser.contentDocument.location.href.indexOf("about:socialerror?")==0, "sidebar is on social error page");
ok(sbrowser.contentDocument.documentURI.indexOf("about:socialerror?mode=tryAgainOnly")==0, "sidebar is on social error page");
gc();
// Add a new load listener, then find and click the "try again" button.
onSidebarLoad(function() {
// should still be on the error page.
ok(sbrowser.contentDocument.location.href.indexOf("about:socialerror?")==0, "sidebar is still on social error page");
ok(sbrowser.contentDocument.documentURI.indexOf("about:socialerror?mode=tryAgainOnly")==0, "sidebar is still on social error page");
// go online and try again - this should work.
goOnline().then(function () {
onSidebarLoad(function() {
// should now be on the correct page.
is(sbrowser.contentDocument.location.href, manifest.sidebarURL, "sidebar is now on social sidebar page");
is(sbrowser.contentDocument.documentURI, manifest.sidebarURL, "sidebar is now on social sidebar page");
next();
});
sbrowser.contentDocument.getElementById("btnTryAgain").click();
@ -97,8 +97,8 @@ var tests = {
},
function() { // the "load" callback.
todo_is(panelCallbackCount, 0, "Bug 833207 - should be no callback when error page loads.");
let href = panel.firstChild.contentDocument.location.href;
ok(href.indexOf("about:socialerror?")==0, "flyout is on social error page");
let href = panel.firstChild.contentDocument.documentURI;
ok(href.indexOf("about:socialerror?mode=compactInfo")==0, "flyout is on social error page");
// Bug 832943 - the listeners previously stopped working after a GC, so
// force a GC now and try again.
gc();
@ -109,8 +109,8 @@ var tests = {
},
function() { // the "load" callback.
todo_is(panelCallbackCount, 0, "Bug 833207 - should be no callback when error page loads.");
let href = panel.firstChild.contentDocument.location.href;
ok(href.indexOf("about:socialerror?")==0, "flyout is on social error page");
let href = panel.firstChild.contentDocument.documentURI;
ok(href.indexOf("about:socialerror?mode=compactInfo")==0, "flyout is on social error page");
gc();
SocialFlyout.unload();
next();
@ -134,7 +134,7 @@ var tests = {
function() { // the "load" callback.
todo_is(panelCallbackCount, 0, "Bug 833207 - should be no callback when error page loads.");
let chat = getChatBar().selectedChat;
waitForCondition(function() chat.content != null && chat.contentDocument.location.href.indexOf("about:socialerror?")==0,
waitForCondition(function() chat.content != null && chat.contentDocument.documentURI.indexOf("about:socialerror?mode=tryAgainOnly")==0,
function() {
chat.close();
next();
@ -157,7 +157,7 @@ var tests = {
null,
function() { // the "load" callback.
let chat = getChatBar().selectedChat;
is(chat.contentDocument.location.href, url, "correct url loaded");
is(chat.contentDocument.documentURI, url, "correct url loaded");
// toggle to a detached window.
chat.swapWindows().then(
chat => {
@ -169,7 +169,7 @@ var tests = {
ok(!!chat.content, "we have chat content 2");
chat.contentDocument.location.reload();
info("chat reload called");
waitForCondition(function() chat.contentDocument.location.href.indexOf("about:socialerror?")==0,
waitForCondition(function() chat.contentDocument.documentURI.indexOf("about:socialerror?mode=tryAgainOnly")==0,
function() {
chat.close();
next();

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

@ -238,7 +238,7 @@ var tests = {
ensureEventFired(btn.panel, "popupshown").then(() => {
info("marks panel is open");
ensureFrameLoaded(btn.content).then(() => {
is(btn.contentDocument.location.href.indexOf("about:socialerror?"), 0, "social error page is showing");
is(btn.contentDocument.documentURI.indexOf("about:socialerror?mode=tryAgainOnly"), 0, "social error page is showing "+btn.contentDocument.documentURI);
// cleanup after the page has been unmarked
ensureBrowserTabClosed(tab).then(() => {
ok(btn.disabled, "button is disabled");

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

@ -183,7 +183,7 @@ var tests = {
let panel = document.getElementById("social-notification-panel");
ensureEventFired(panel, "popupshown").then(() => {
ensureFrameLoaded(frame).then(() => {
is(frame.contentDocument.location.href.indexOf("about:socialerror?"), 0, "social error page is showing "+frame.contentDocument.location.href);
is(frame.contentDocument.documentURI.indexOf("about:socialerror?mode=tryAgainOnly"), 0, "social error page is showing "+frame.contentDocument.documentURI);
panel.hidePopup();
goOnline().then(next);
});

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

@ -63,7 +63,7 @@ var tests = {
Services.obs.removeObserver(observer, 'ipc:content-shutdown');
// Add another sidebar load listener - it should be the error page.
onSidebarLoad(function() {
ok(sbrowser.contentDocument.location.href.indexOf("about:socialerror?")==0, "is on social error page");
ok(sbrowser.contentDocument.location.href.indexOf("about:socialerror?mode=workerFailure")==0, "is on social error page");
// after reloading, the sidebar should reload
onSidebarLoad(function() {
// now ping both workers - they should both be alive.

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

@ -596,7 +596,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
Cc["@mozilla.org/widget/clipboardhelper;1"]
.getService(Ci.nsIClipboardHelper)
.copyString(val, document);
.copyString(val);
},
supportsCommand: function(aCommand) {
switch (aCommand) {
@ -969,7 +969,7 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
Cc["@mozilla.org/widget/clipboardhelper;1"]
.getService(Ci.nsIClipboardHelper)
.copyStringToClipboard(val, Ci.nsIClipboard.kSelectionClipboard, document);
.copyStringToClipboard(val, Ci.nsIClipboard.kSelectionClipboard);
]]></handler>
</handlers>

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

@ -85,6 +85,7 @@ browser.jar:
* content/browser/chatWindow.xul (content/chatWindow.xul)
content/browser/tab-content.js (content/tab-content.js)
content/browser/content.js (content/content.js)
content/browser/social-content.js (content/social-content.js)
content/browser/defaultthemes/1.footer.jpg (content/defaultthemes/1.footer.jpg)
content/browser/defaultthemes/1.header.jpg (content/defaultthemes/1.header.jpg)
content/browser/defaultthemes/1.icon.jpg (content/defaultthemes/1.icon.jpg)

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

@ -1,60 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 132 62" width="132" height="62">
<path d="M5.3,45.2H2.7L0.1,57.3h3.2c1.8,0,3-0.4,4.2-1.5c1.4-1.2,2.6-4.1,2.6-6.2c0-1.7-0.4-2.8-1.2-3.5C8,45.4,7.1,45.2,5.3,45.2z
M6.6,54.9c-0.7,0.9-1.9,1.3-3.5,1.3H1.8l2.1-9.8h1.5c1.3,0,2,0.2,2.6,1.1c0.4,0.5,0.5,1.3,0.5,2.4C8.5,51.2,7.9,53.4,6.6,54.9z
M15.3,48.3c-1.1,0-2,0.4-2.9,1.2c-1.3,1.2-2,3.1-2,4.8c0,2,1.3,3.2,2.9,3.2c1.8,0,2.7-0.4,3.6-1.3l-0.6-0.8c-0.8,0.7-1.5,1-2.6,1
c-0.9,0-1.8-0.7-1.8-1.9c0-0.3,0-0.7,0.1-1.1c0.4,0,0.8,0,1.1,0c1.9,0,3.1-0.3,3.8-1c0.5-0.5,0.8-1.1,0.8-1.8
C17.8,49.2,17,48.3,15.3,48.3z M16,51.7c-0.5,0.4-1.2,0.7-2.8,0.7c-0.3,0-0.7,0-0.9,0c0.5-1.8,1.6-3,2.8-3c1,0,1.4,0.5,1.4,1.2
C16.4,51,16.2,51.4,16,51.7z M25,48.5l-3.3,5.9c-0.4,0.6-0.5,1-0.7,1.5h0c0-0.4-0.1-0.9-0.1-1.5l-0.8-6.1l-1.4,0.3l1.3,8.8h1.4
l5.2-8.9L25,48.5z M30.7,48.3c-1.1,0-2,0.4-2.9,1.2c-1.3,1.2-2,3.1-2,4.8c0,2,1.3,3.2,2.9,3.2c1.8,0,2.7-0.4,3.6-1.3l-0.6-0.8
c-0.8,0.7-1.5,1-2.6,1c-0.9,0-1.8-0.7-1.8-1.9c0-0.3,0-0.7,0.1-1.1c0.4,0,0.8,0,1.1,0c1.9,0,3.1-0.3,3.8-1c0.5-0.5,0.8-1.1,0.8-1.8
C33.3,49.2,32.4,48.3,30.7,48.3z M31.4,51.7c-0.5,0.4-1.2,0.7-2.8,0.7c-0.3,0-0.7,0-0.9,0c0.5-1.8,1.6-3,2.8-3c1,0,1.4,0.5,1.4,1.2
C31.9,51,31.7,51.4,31.4,51.7z M37.2,47.5c0.2-1.1,0.4-2.5,0.1-3.2l-1.5,0.6c0.2,0.6,0.2,1.5-0.1,2.7L34,55.7
c-0.1,0.3-0.1,0.5-0.1,0.8c0,0.7,0.4,1,1.2,1c0.4,0,0.7,0,1.1-0.2l-0.1-0.9c-0.1,0-0.2,0-0.3,0c-0.2,0-0.4-0.1-0.4-0.4
c0-0.2,0-0.4,0.1-0.6L37.2,47.5z M42.3,48.2c-2.8,0-4.9,2.6-4.9,6.1c0,2,1.1,3.2,3,3.2c2.9,0,4.9-2.7,4.9-6.1
C45.3,49.5,44.4,48.2,42.3,48.2z M40.7,56.4c-1.1,0-1.7-0.6-1.7-1.9c0-2.9,1.2-5.1,3.2-5.1c0.9,0,1.7,0.5,1.7,1.9
C43.8,54,42.7,56.4,40.7,56.4z M52.1,48.3c-1,0-2.3,0.5-3.2,1.8c0.2-0.9,0.1-1.4-0.1-1.9l-1.3,0.6c0.2,0.6,0.2,1-0.1,2.2l-2.2,10
l1.4-0.3l0.8-3.6c0.6,0.3,1.2,0.4,2.1,0.4c1.2,0,2.4-0.6,3.3-1.6c0.9-1.1,1.5-3.2,1.5-4.8C54.4,49.4,53.7,48.3,52.1,48.3z
M51.8,55.2c-0.4,0.7-1.4,1.2-2.2,1.2c-0.7,0-1.4-0.2-1.8-0.5l0.9-4.3c0.9-1.3,2-1.9,2.9-1.9c0.9,0,1.3,0.5,1.3,1.7
C52.9,52.5,52.4,54.3,51.8,55.2z M60.1,48.3c-1.1,0-2,0.4-2.9,1.2c-1.3,1.2-2,3.1-2,4.8c0,2,1.3,3.2,2.9,3.2c1.8,0,2.7-0.4,3.6-1.3
l-0.6-0.8c-0.8,0.7-1.5,1-2.6,1c-0.9,0-1.8-0.7-1.8-1.9c0-0.3,0-0.7,0.1-1.1c0.4,0,0.8,0,1.1,0c1.9,0,3.1-0.3,3.8-1
c0.5-0.5,0.8-1.1,0.8-1.8C62.6,49.2,61.8,48.3,60.1,48.3z M60.8,51.7c-0.5,0.4-1.2,0.7-2.8,0.7c-0.3,0-0.7,0-0.9,0
c0.5-1.8,1.6-3,2.8-3c1,0,1.4,0.5,1.4,1.2C61.2,51,61,51.4,60.8,51.7z M65.8,50.3c0.2-1,0.2-1.5-0.1-2.1l-1.3,0.6
c0.2,0.6,0.2,1.2-0.1,2.5l-1.3,6h1.4l1.2-5.5c0.9-1.3,1.8-2,2.6-2c0.3,0,0.4,0,0.6,0.1l0.6-1.5c-0.2-0.1-0.3-0.1-0.7-0.1
C67.8,48.3,66.6,49.1,65.8,50.3z M78.1,51.6l0.3-1.3h-4.2l0.8-4h5l0.5-1.2h-6.7l-2.6,12.1H78l0.3-1.3h-5.4l0.9-4.4H78.1z M86.6,54.5
l2.1-9.8l-1.4-0.2l-0.9,4.3c-0.4-0.2-1-0.3-2-0.3c-1,0-2.2,0.4-3.1,1.3c-1.3,1.3-2,3.1-2,4.9c0,1.9,0.8,3,2.5,3
c1.3,0,2.3-0.5,3.1-1.6c-0.1,1,0.2,1.4,0.7,1.9l1.2-0.9C86.4,56.3,86.2,55.9,86.6,54.5z M85.2,54.2c-0.9,1.5-2,2.1-3,2.1
c-0.9,0-1.3-0.6-1.3-1.7c0-1.3,0.6-3.2,1.4-4.1c0.6-0.6,1.4-1,2.1-1c0.8,0,1.2,0.1,1.7,0.4L85.2,54.2z M88.2,57.3h1.5l1.9-9
l-1.5,0.2L88.2,57.3z M91.4,44.7c-0.6,0-1.1,0.5-1.1,1.1c0,0.6,0.5,1.1,1.1,1.1s1.1-0.5,1.1-1.1S92,44.7,91.4,44.7z M93.7,55.7
c0-0.2,0-0.6,0.1-1l1.1-5.2h1.9l0.6-1h-2.2c0.2-0.8,0.5-1.9,0.7-2.5l-1.5,0.3c-0.2,0.7-0.4,1.5-0.6,2.2h-1.2l-0.2,1h1.2l-1.1,5.3
c-0.1,0.5-0.1,1-0.1,1.3c0,0.9,0.5,1.4,1.6,1.4c0.6,0,1.1-0.1,1.6-0.4v-0.9c-0.3,0.1-0.5,0.2-0.9,0.2C94,56.5,93.7,56.3,93.7,55.7z
M99.8,44.7c-0.6,0-1.1,0.5-1.1,1.1c0,0.6,0.5,1.1,1.1,1.1s1.1-0.5,1.1-1.1S100.4,44.7,99.8,44.7z M96.6,57.3h1.5l1.9-9l-1.5,0.2
L96.6,57.3z M105.3,48.2c-2.8,0-4.9,2.6-4.9,6.1c0,2,1.1,3.2,3,3.2c2.9,0,4.9-2.7,4.9-6.1C108.3,49.5,107.3,48.2,105.3,48.2z
M103.6,56.4c-1.1,0-1.7-0.6-1.7-1.9c0-2.9,1.2-5.1,3.1-5.1c0.9,0,1.7,0.5,1.7,1.9C106.8,54,105.7,56.4,103.6,56.4z M115.3,48.3
c-1.1,0-2.5,0.6-3.4,1.9c0.2-0.9,0.1-1.4-0.1-1.9l-1.3,0.6c0.2,0.7,0.2,1-0.1,2.2l-1.4,6.3h1.4l1.2-5.8c1.2-1.5,2.4-2.1,3.1-2.1
c0.6,0,0.9,0.3,0.9,0.9c0,0.2,0,0.5-0.1,1l-1.3,6h1.4l1.4-6.7c0-0.2,0.1-0.4,0.1-0.6C117.1,49,116.4,48.3,115.3,48.3z M130.9,12.5
c-0.1-0.2-0.2-0.4-0.4-0.6c-0.2-0.2-0.4-0.3-0.6-0.4c-0.2-0.1-0.5-0.1-0.7-0.1c-0.2,0-0.5,0-0.7,0.1c-0.2,0.1-0.4,0.2-0.6,0.4
c-0.2,0.2-0.3,0.4-0.4,0.6c-0.1,0.2-0.1,0.5-0.1,0.7c0,0.3,0,0.5,0.1,0.7c0.1,0.2,0.2,0.4,0.4,0.6c0.2,0.2,0.4,0.3,0.6,0.4
c0.2,0.1,0.5,0.1,0.7,0.1c0.2,0,0.5,0,0.7-0.1c0.2-0.1,0.4-0.2,0.6-0.4c0.2-0.2,0.3-0.4,0.4-0.6c0.1-0.2,0.1-0.5,0.1-0.7
C131,13,131,12.7,130.9,12.5z M130.5,13.8c-0.1,0.2-0.2,0.3-0.3,0.5c-0.1,0.1-0.3,0.2-0.5,0.3c-0.2,0.1-0.4,0.1-0.6,0.1
c-0.2,0-0.4,0-0.6-0.1c-0.2-0.1-0.3-0.2-0.5-0.3c-0.1-0.1-0.2-0.3-0.3-0.5c-0.1-0.2-0.1-0.4-0.1-0.6c0-0.2,0-0.4,0.1-0.6
c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.1,0.3-0.2,0.5-0.3c0.2-0.1,0.4-0.1,0.6-0.1c0.2,0,0.4,0,0.6,0.1c0.2,0.1,0.3,0.2,0.5,0.3
c0.1,0.1,0.2,0.3,0.3,0.5c0.1,0.2,0.1,0.4,0.1,0.6C130.6,13.5,130.6,13.6,130.5,13.8z M129.6,13.6c0,0-0.1-0.1-0.1-0.1
c0,0-0.1-0.1-0.1-0.1c0,0,0,0-0.1-0.1c0.2,0,0.3-0.1,0.4-0.2c0.1-0.1,0.1-0.2,0.1-0.4c0-0.1,0-0.2,0-0.2c0-0.1-0.1-0.1-0.1-0.2
c-0.1-0.1-0.1-0.1-0.2-0.1c-0.1,0-0.2,0-0.3,0h-0.6v2h0.3v-0.9c0,0,0.1,0,0.1,0c0,0,0,0,0.1,0c0.1,0.1,0.1,0.1,0.2,0.2
c0.1,0.1,0.1,0.2,0.2,0.3l0.2,0.3h0.4l-0.3-0.5C129.7,13.7,129.6,13.7,129.6,13.6z M129.1,13.1h-0.2v-0.6h0.2c0.2,0,0.3,0,0.3,0.1
c0.1,0.1,0.1,0.1,0.1,0.2c0,0.1,0,0.2-0.1,0.2c0,0-0.1,0.1-0.1,0.1C129.3,13.1,129.2,13.1,129.1,13.1z M0,36.8h5.8V20.9h9.7v-4.7
H5.8V6.9h11.9l0.7-4.7H0V36.8z M24.3,7.7C26.4,7.7,28,6,28,4c0-2.1-1.7-3.7-3.6-3.7c-2.1,0-3.7,1.7-3.7,3.7
C20.7,6,22.3,7.7,24.3,7.7z M21.5,36.8h5.6V10.9l-5.6,1V36.8z M32.4,36.8H38V19.7c0.5-2.1,2.5-3.7,4.8-3.7c0.6,0,1,0.2,1.6,0.4
l1.7-5.1c-0.7-0.3-1.2-0.4-2-0.4c-2.5,0-4.5,1.3-6.5,4.1c0-1.4-0.4-2.9-1-4l-5.1,1.3c0.6,1.6,0.9,3.6,0.9,6.8V36.8z M56.9,37.4
c3.4,0,6.5-1.1,9.2-3.4l-2.2-3.4c-1.9,1.7-4,2.5-6.3,2.5c-5,0-6.3-3.7-6.3-7.2v-0.4h15.2v-1.2c0-5.9-1.1-9-3.3-11
c-2.2-2-4.5-2.6-7-2.6c-3.2,0-5.7,1.1-7.8,3.4c-2.2,2.5-3.2,5.4-3.2,9.9C45.2,32.3,49.8,37.4,56.9,37.4z M56.2,15
c2.8,0,4.6,2.4,4.6,6.6h-9.4C51.4,17.5,53.1,15,56.2,15z M76.1,36.8V15.3h5.2l1.4-3.8h-6.6V7.6c0-2.3,1.2-3.6,3.1-3.6
C80.2,4,81,4.4,82.2,5l1.8-3.5c-1.8-1-3.6-1.5-5.7-1.5c-4.5,0-7.7,2.5-7.7,7.7c0,2.4,0.2,3.8,0.2,3.8h-2.5v3.8h2.4v21.5H76.1z
M93.1,37.4c6.9,0,11.3-5.1,11.3-13.2c0-8-4.1-13.4-11.4-13.4c-6.7,0-11.1,5.2-11.1,13.3C81.9,32.3,86.2,37.4,93.1,37.4z M93.1,15
c3.2,0,5.2,2.1,5.2,9.3c0,6.4-1.8,9-5.1,9c-3.3,0-5.2-2.2-5.2-9.5C88.1,17.7,89.6,15,93.1,15z M126.1,11.5h-6.4
c-0.8,1.1-3.3,6.1-4,7.8c-1.2-2.3-3.5-6.3-4.6-8.2l-6,1.2l7.3,10.9L103,36.8h7c1-1.4,4.6-7.6,5.5-9.5c0.5,0.9,4.6,8,5.5,9.5h6.9
L118.6,23L126.1,11.5z" fill="#fff" />
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 132 62" width="132" height="62">
<path fill="#fff" d="M5.3,45.2H2.7L0.1,57.3h3.2c1.8,0,3-0.4,4.2-1.5c1.4-1.2,2.6-4.1,2.6-6.2c0-1.7-0.4-2.8-1.2-3.5C8,45.4,7.1,45.2,5.3,45.2z
M6.6,54.9c-0.7,0.9-1.9,1.3-3.5,1.3H1.8l2.1-9.8h1.5c1.3,0,2,0.2,2.6,1.1c0.4,0.5,0.5,1.3,0.5,2.4C8.5,51.2,7.9,53.4,6.6,54.9z
M15.3,48.3c-1.1,0-2,0.4-2.9,1.2c-1.3,1.2-2,3.1-2,4.8c0,2,1.3,3.2,2.9,3.2c1.8,0,2.7-0.4,3.6-1.3l-0.6-0.8c-0.8,0.7-1.5,1-2.6,1
c-0.9,0-1.8-0.7-1.8-1.9c0-0.3,0-0.7,0.1-1.1c0.4,0,0.8,0,1.1,0c1.9,0,3.1-0.3,3.8-1c0.5-0.5,0.8-1.1,0.8-1.8
C17.8,49.2,17,48.3,15.3,48.3z M16,51.7c-0.5,0.4-1.2,0.7-2.8,0.7c-0.3,0-0.7,0-0.9,0c0.5-1.8,1.6-3,2.8-3c1,0,1.4,0.5,1.4,1.2
C16.4,51,16.2,51.4,16,51.7z M25,48.5l-3.3,5.9c-0.4,0.6-0.5,1-0.7,1.5h0c0-0.4-0.1-0.9-0.1-1.5l-0.8-6.1l-1.4,0.3l1.3,8.8h1.4
l5.2-8.9L25,48.5z M30.7,48.3c-1.1,0-2,0.4-2.9,1.2c-1.3,1.2-2,3.1-2,4.8c0,2,1.3,3.2,2.9,3.2c1.8,0,2.7-0.4,3.6-1.3l-0.6-0.8
c-0.8,0.7-1.5,1-2.6,1c-0.9,0-1.8-0.7-1.8-1.9c0-0.3,0-0.7,0.1-1.1c0.4,0,0.8,0,1.1,0c1.9,0,3.1-0.3,3.8-1c0.5-0.5,0.8-1.1,0.8-1.8
C33.3,49.2,32.4,48.3,30.7,48.3z M31.4,51.7c-0.5,0.4-1.2,0.7-2.8,0.7c-0.3,0-0.7,0-0.9,0c0.5-1.8,1.6-3,2.8-3c1,0,1.4,0.5,1.4,1.2
C31.9,51,31.7,51.4,31.4,51.7z M37.2,47.5c0.2-1.1,0.4-2.5,0.1-3.2l-1.5,0.6c0.2,0.6,0.2,1.5-0.1,2.7L34,55.7
c-0.1,0.3-0.1,0.5-0.1,0.8c0,0.7,0.4,1,1.2,1c0.4,0,0.7,0,1.1-0.2l-0.1-0.9c-0.1,0-0.2,0-0.3,0c-0.2,0-0.4-0.1-0.4-0.4
c0-0.2,0-0.4,0.1-0.6L37.2,47.5z M42.3,48.2c-2.8,0-4.9,2.6-4.9,6.1c0,2,1.1,3.2,3,3.2c2.9,0,4.9-2.7,4.9-6.1
C45.3,49.5,44.4,48.2,42.3,48.2z M40.7,56.4c-1.1,0-1.7-0.6-1.7-1.9c0-2.9,1.2-5.1,3.2-5.1c0.9,0,1.7,0.5,1.7,1.9
C43.8,54,42.7,56.4,40.7,56.4z M52.1,48.3c-1,0-2.3,0.5-3.2,1.8c0.2-0.9,0.1-1.4-0.1-1.9l-1.3,0.6c0.2,0.6,0.2,1-0.1,2.2l-2.2,10
l1.4-0.3l0.8-3.6c0.6,0.3,1.2,0.4,2.1,0.4c1.2,0,2.4-0.6,3.3-1.6c0.9-1.1,1.5-3.2,1.5-4.8C54.4,49.4,53.7,48.3,52.1,48.3z
M51.8,55.2c-0.4,0.7-1.4,1.2-2.2,1.2c-0.7,0-1.4-0.2-1.8-0.5l0.9-4.3c0.9-1.3,2-1.9,2.9-1.9c0.9,0,1.3,0.5,1.3,1.7
C52.9,52.5,52.4,54.3,51.8,55.2z M60.1,48.3c-1.1,0-2,0.4-2.9,1.2c-1.3,1.2-2,3.1-2,4.8c0,2,1.3,3.2,2.9,3.2c1.8,0,2.7-0.4,3.6-1.3
l-0.6-0.8c-0.8,0.7-1.5,1-2.6,1c-0.9,0-1.8-0.7-1.8-1.9c0-0.3,0-0.7,0.1-1.1c0.4,0,0.8,0,1.1,0c1.9,0,3.1-0.3,3.8-1
c0.5-0.5,0.8-1.1,0.8-1.8C62.6,49.2,61.8,48.3,60.1,48.3z M60.8,51.7c-0.5,0.4-1.2,0.7-2.8,0.7c-0.3,0-0.7,0-0.9,0
c0.5-1.8,1.6-3,2.8-3c1,0,1.4,0.5,1.4,1.2C61.2,51,61,51.4,60.8,51.7z M65.8,50.3c0.2-1,0.2-1.5-0.1-2.1l-1.3,0.6
c0.2,0.6,0.2,1.2-0.1,2.5l-1.3,6h1.4l1.2-5.5c0.9-1.3,1.8-2,2.6-2c0.3,0,0.4,0,0.6,0.1l0.6-1.5c-0.2-0.1-0.3-0.1-0.7-0.1
C67.8,48.3,66.6,49.1,65.8,50.3z M78.1,51.6l0.3-1.3h-4.2l0.8-4h5l0.5-1.2h-6.7l-2.6,12.1H78l0.3-1.3h-5.4l0.9-4.4H78.1z M86.6,54.5
l2.1-9.8l-1.4-0.2l-0.9,4.3c-0.4-0.2-1-0.3-2-0.3c-1,0-2.2,0.4-3.1,1.3c-1.3,1.3-2,3.1-2,4.9c0,1.9,0.8,3,2.5,3
c1.3,0,2.3-0.5,3.1-1.6c-0.1,1,0.2,1.4,0.7,1.9l1.2-0.9C86.4,56.3,86.2,55.9,86.6,54.5z M85.2,54.2c-0.9,1.5-2,2.1-3,2.1
c-0.9,0-1.3-0.6-1.3-1.7c0-1.3,0.6-3.2,1.4-4.1c0.6-0.6,1.4-1,2.1-1c0.8,0,1.2,0.1,1.7,0.4L85.2,54.2z M88.2,57.3h1.5l1.9-9
l-1.5,0.2L88.2,57.3z M91.4,44.7c-0.6,0-1.1,0.5-1.1,1.1c0,0.6,0.5,1.1,1.1,1.1s1.1-0.5,1.1-1.1S92,44.7,91.4,44.7z M93.7,55.7
c0-0.2,0-0.6,0.1-1l1.1-5.2h1.9l0.6-1h-2.2c0.2-0.8,0.5-1.9,0.7-2.5l-1.5,0.3c-0.2,0.7-0.4,1.5-0.6,2.2h-1.2l-0.2,1h1.2l-1.1,5.3
c-0.1,0.5-0.1,1-0.1,1.3c0,0.9,0.5,1.4,1.6,1.4c0.6,0,1.1-0.1,1.6-0.4v-0.9c-0.3,0.1-0.5,0.2-0.9,0.2C94,56.5,93.7,56.3,93.7,55.7z
M99.8,44.7c-0.6,0-1.1,0.5-1.1,1.1c0,0.6,0.5,1.1,1.1,1.1s1.1-0.5,1.1-1.1S100.4,44.7,99.8,44.7z M96.6,57.3h1.5l1.9-9l-1.5,0.2
L96.6,57.3z M105.3,48.2c-2.8,0-4.9,2.6-4.9,6.1c0,2,1.1,3.2,3,3.2c2.9,0,4.9-2.7,4.9-6.1C108.3,49.5,107.3,48.2,105.3,48.2z
M103.6,56.4c-1.1,0-1.7-0.6-1.7-1.9c0-2.9,1.2-5.1,3.1-5.1c0.9,0,1.7,0.5,1.7,1.9C106.8,54,105.7,56.4,103.6,56.4z M115.3,48.3
c-1.1,0-2.5,0.6-3.4,1.9c0.2-0.9,0.1-1.4-0.1-1.9l-1.3,0.6c0.2,0.7,0.2,1-0.1,2.2l-1.4,6.3h1.4l1.2-5.8c1.2-1.5,2.4-2.1,3.1-2.1
c0.6,0,0.9,0.3,0.9,0.9c0,0.2,0,0.5-0.1,1l-1.3,6h1.4l1.4-6.7c0-0.2,0.1-0.4,0.1-0.6C117.1,49,116.4,48.3,115.3,48.3z M130.9,12.5
c-0.1-0.2-0.2-0.4-0.4-0.6c-0.2-0.2-0.4-0.3-0.6-0.4c-0.2-0.1-0.5-0.1-0.7-0.1c-0.2,0-0.5,0-0.7,0.1c-0.2,0.1-0.4,0.2-0.6,0.4
c-0.2,0.2-0.3,0.4-0.4,0.6c-0.1,0.2-0.1,0.5-0.1,0.7c0,0.3,0,0.5,0.1,0.7c0.1,0.2,0.2,0.4,0.4,0.6c0.2,0.2,0.4,0.3,0.6,0.4
c0.2,0.1,0.5,0.1,0.7,0.1c0.2,0,0.5,0,0.7-0.1c0.2-0.1,0.4-0.2,0.6-0.4c0.2-0.2,0.3-0.4,0.4-0.6c0.1-0.2,0.1-0.5,0.1-0.7
C131,13,131,12.7,130.9,12.5z M130.5,13.8c-0.1,0.2-0.2,0.3-0.3,0.5c-0.1,0.1-0.3,0.2-0.5,0.3c-0.2,0.1-0.4,0.1-0.6,0.1
c-0.2,0-0.4,0-0.6-0.1c-0.2-0.1-0.3-0.2-0.5-0.3c-0.1-0.1-0.2-0.3-0.3-0.5c-0.1-0.2-0.1-0.4-0.1-0.6c0-0.2,0-0.4,0.1-0.6
c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.1,0.3-0.2,0.5-0.3c0.2-0.1,0.4-0.1,0.6-0.1c0.2,0,0.4,0,0.6,0.1c0.2,0.1,0.3,0.2,0.5,0.3
c0.1,0.1,0.2,0.3,0.3,0.5c0.1,0.2,0.1,0.4,0.1,0.6C130.6,13.5,130.6,13.6,130.5,13.8z M129.6,13.6c0,0-0.1-0.1-0.1-0.1
c0,0-0.1-0.1-0.1-0.1c0,0,0,0-0.1-0.1c0.2,0,0.3-0.1,0.4-0.2c0.1-0.1,0.1-0.2,0.1-0.4c0-0.1,0-0.2,0-0.2c0-0.1-0.1-0.1-0.1-0.2
c-0.1-0.1-0.1-0.1-0.2-0.1c-0.1,0-0.2,0-0.3,0h-0.6v2h0.3v-0.9c0,0,0.1,0,0.1,0c0,0,0,0,0.1,0c0.1,0.1,0.1,0.1,0.2,0.2
c0.1,0.1,0.1,0.2,0.2,0.3l0.2,0.3h0.4l-0.3-0.5C129.7,13.7,129.6,13.7,129.6,13.6z M129.1,13.1h-0.2v-0.6h0.2c0.2,0,0.3,0,0.3,0.1
c0.1,0.1,0.1,0.1,0.1,0.2c0,0.1,0,0.2-0.1,0.2c0,0-0.1,0.1-0.1,0.1C129.3,13.1,129.2,13.1,129.1,13.1z M0,36.8h5.8V20.9h9.7v-4.7
H5.8V6.9h11.9l0.7-4.7H0V36.8z M24.3,7.7C26.4,7.7,28,6,28,4c0-2.1-1.7-3.7-3.6-3.7c-2.1,0-3.7,1.7-3.7,3.7
C20.7,6,22.3,7.7,24.3,7.7z M21.5,36.8h5.6V10.9l-5.6,1V36.8z M32.4,36.8H38V19.7c0.5-2.1,2.5-3.7,4.8-3.7c0.6,0,1,0.2,1.6,0.4
l1.7-5.1c-0.7-0.3-1.2-0.4-2-0.4c-2.5,0-4.5,1.3-6.5,4.1c0-1.4-0.4-2.9-1-4l-5.1,1.3c0.6,1.6,0.9,3.6,0.9,6.8V36.8z M56.9,37.4
c3.4,0,6.5-1.1,9.2-3.4l-2.2-3.4c-1.9,1.7-4,2.5-6.3,2.5c-5,0-6.3-3.7-6.3-7.2v-0.4h15.2v-1.2c0-5.9-1.1-9-3.3-11
c-2.2-2-4.5-2.6-7-2.6c-3.2,0-5.7,1.1-7.8,3.4c-2.2,2.5-3.2,5.4-3.2,9.9C45.2,32.3,49.8,37.4,56.9,37.4z M56.2,15
c2.8,0,4.6,2.4,4.6,6.6h-9.4C51.4,17.5,53.1,15,56.2,15z M76.1,36.8V15.3h5.2l1.4-3.8h-6.6V7.6c0-2.3,1.2-3.6,3.1-3.6
C80.2,4,81,4.4,82.2,5l1.8-3.5c-1.8-1-3.6-1.5-5.7-1.5c-4.5,0-7.7,2.5-7.7,7.7c0,2.4,0.2,3.8,0.2,3.8h-2.5v3.8h2.4v21.5H76.1z
M93.1,37.4c6.9,0,11.3-5.1,11.3-13.2c0-8-4.1-13.4-11.4-13.4c-6.7,0-11.1,5.2-11.1,13.3C81.9,32.3,86.2,37.4,93.1,37.4z M93.1,15
c3.2,0,5.2,2.1,5.2,9.3c0,6.4-1.8,9-5.1,9c-3.3,0-5.2-2.2-5.2-9.5C88.1,17.7,89.6,15,93.1,15z M126.1,11.5h-6.4
c-0.8,1.1-3.3,6.1-4,7.8c-1.2-2.3-3.5-6.3-4.6-8.2l-6,1.2l7.3,10.9L103,36.8h7c1-1.4,4.6-7.6,5.5-9.5c0.5,0.9,4.6,8,5.5,9.5h6.9
L118.6,23L126.1,11.5z"/>
</svg>

До

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

После

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

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

@ -1,25 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
x="0px" y="0px" viewBox="-45 31 40 40"
enable-background="new -45 31 40 40">
<path fill="#CCCCCC" d="M-14.1,54.7c0.7-1.4,1.7-4.4,0.8-6.9c0,0,0,0,0,0.1l0,0c0,0-0.2,0.5-0.4,1.3c0-0.1,0-0.2,0-0.3
c0.1-0.9,0-1.9-0.1-2.9c-0.3-1.5-1.4-2.8-2-3.2c0,0,0.1,0,0.1,0.1c-0.1-0.1-0.1-0.1-0.1-0.1s0,0.1,0.1,0.4c-0.7-1.1-1.6-1.5-1.6-1.5
s0,0.2,0.1,0.5c-2-1.9-4.7-3-7.6-3c-3,0-5.7,1.2-7.8,3.1c0.1,0.1,0.2,0.3,0.4,0.5c0,0,0.8-0.1,1.7-0.1c1.7-1.2,3.6-1.8,5.7-1.8
c2.6,0,5.1,1.1,7,3c-0.2-0.1-0.1,0,0,0.1c-0.6-0.4-1.2-0.8-1.7-0.8c1,0.8,2.6,2.7,2.4,6.2c-0.3-0.6-0.6-1-0.9-1.3
c0.4,3.5,0,4.2-0.2,5.1c0-0.4-0.2-0.7-0.3-0.9c0,0,0,1.1-0.7,2.6c-0.5,1.2-1.1,1.5-1.3,1.5c-0.2,0-0.1-0.2-0.1-0.4
c0,0-0.4,0.2-0.7,0.6c-0.3,0.4-0.6,0.8-0.8,0.6c0.1-0.1,0.2-0.3,0.3-0.4c-0.1,0.1-0.5,0.4-1.2,0.5c-0.3,0-1.6,0.3-3.3-0.6
c0.3,0,0.6-0.1,0.9,0.1c-0.3-0.3-1-0.3-1.5-0.4c-0.5-0.4-1.1-1-1.4-1.4c1.3,0.3,2.8,0.1,3.6-0.5s1.3-1,1.8-0.9
c0.4,0.1,0.7-0.4,0.4-0.8c-0.3-0.4-1.2-1-2.3-0.7c-0.8,0.2-1.8,1.1-3.3,0.2c-1.3-0.8-1.3-1.4-1.3-1.8c0-0.3,0.2-0.7,0.5-0.8
c0.2,0.1,0.3,0.1,0.3,0.1s-0.1-0.1-0.1-0.2l0,0c0.1,0,0.4,0.2,0.6,0.2c0.2,0.1,0.3,0.2,0.3,0.2s0,0,0-0.1c0,0-0.1-0.2-0.3-0.3l0,0
c0.1,0,0.2,0.1,0.4,0.2c0-0.2,0.1-0.4,0.1-0.7c0-0.2,0-0.3-0.1-0.4c-0.1-0.1,0-0.1,0.1,0c0-0.1,0-0.1-0.1-0.2l0,0c0,0,0,0,0-0.1
c0.2-0.3,1.8-1.2,1.9-1.3c0.2-0.1,0.3-0.3,0.4-0.5c0.2-0.1,0.3-0.5,0.3-0.8c0-0.1-0.2-0.3-0.4-0.3c-0.1,0-0.4-0.1-0.6,0l0,0
c-0.3,0-0.7,0-1.2,0s-0.8-0.3-1-0.6c0-0.1-0.1-0.1-0.1-0.2c0-0.1-0.1-0.2-0.1-0.2c0.2-0.8,0.7-1.5,1.4-2.1c0,0-0.2,0-0.1,0
c0,0,0.3-0.2,0.4-0.2c0.1,0-0.3-0.1-0.6-0.1c-0.5,0.2-0.6,0.2-0.8,0.3c0.1-0.1,0.3-0.2,0.2-0.2c-0.3,0.1-0.7,0.4-1.1,0.6v-0.1
c-0.2,0.1-0.6,0.4-0.7,0.7c0-0.1,0-0.1,0-0.1c-0.1,0-0.2,0.2-0.3,0.3l0,0c-1.1-0.3-2-0.2-2.8,0c-0.2-0.1-0.6-0.5-0.9-1
c0,0,0,0.1-0.1,0.1c-0.1-0.4-0.3-0.9-0.3-1.3v-0.1c0,0-0.1,0.1-0.3,0.3c-0.1,0.2-0.2,0.3-0.2,0.5c0,0.1-0.1,0.2-0.1,0.2v-0.2
c0,0.1-0.1,0.2-0.2,0.3c0,0.2,0,0.3-0.1,0.4l0,0c0,0,0-0.2,0-0.1c-0.1,0.2-0.2,0.5-0.2,0.8c-0.1,0.3-0.1,0.5-0.1,0.8s0,0.7,0,1.2
c0,0.1,0,0.1,0,0.2c-0.3,0.4-0.5,0.7-0.6,0.9c-0.4,0.7-0.7,1.8-1,3.5c0,0,0.2-0.6,0.6-1.3l0,0c-0.3,0.9-0.5,2.3-0.4,4.4
c0-0.1,0.1-0.6,0.2-1.3c0.1,1.4,0.5,3.1,1.5,5c0.8,1.4,1.7,2.4,2.7,3.2c0.2,0.2,0.4,0.3,0.6,0.5c1.3,1,3.3,2.1,5,2.4
c-0.6-0.2-1-0.5-1-0.5s2,0.7,3.5,0.6c-0.5-0.1-0.6-0.3-0.6-0.3s4.2,0.2,6.4-1.5c0.5-0.4,0.8-0.8,0.9-1.2c0.6-0.4,1.3-0.8,2-1.6
c1.2-1.2,1.3-2.1,1.4-3v0.1C-14,55.2-14,54.9-14.1,54.7z"/>
</svg>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-45 31 40 40">
<path fill="#ccc" d="M-14.1,54.7c0.7-1.4,1.7-4.4,0.8-6.9c0,0,0,0,0,0.1l0,0c0,0-0.2,0.5-0.4,1.3c0-0.1,0-0.2,0-0.3
c0.1-0.9,0-1.9-0.1-2.9c-0.3-1.5-1.4-2.8-2-3.2c0,0,0.1,0,0.1,0.1c-0.1-0.1-0.1-0.1-0.1-0.1s0,0.1,0.1,0.4c-0.7-1.1-1.6-1.5-1.6-1.5
s0,0.2,0.1,0.5c-2-1.9-4.7-3-7.6-3c-3,0-5.7,1.2-7.8,3.1c0.1,0.1,0.2,0.3,0.4,0.5c0,0,0.8-0.1,1.7-0.1c1.7-1.2,3.6-1.8,5.7-1.8
c2.6,0,5.1,1.1,7,3c-0.2-0.1-0.1,0,0,0.1c-0.6-0.4-1.2-0.8-1.7-0.8c1,0.8,2.6,2.7,2.4,6.2c-0.3-0.6-0.6-1-0.9-1.3
c0.4,3.5,0,4.2-0.2,5.1c0-0.4-0.2-0.7-0.3-0.9c0,0,0,1.1-0.7,2.6c-0.5,1.2-1.1,1.5-1.3,1.5c-0.2,0-0.1-0.2-0.1-0.4
c0,0-0.4,0.2-0.7,0.6c-0.3,0.4-0.6,0.8-0.8,0.6c0.1-0.1,0.2-0.3,0.3-0.4c-0.1,0.1-0.5,0.4-1.2,0.5c-0.3,0-1.6,0.3-3.3-0.6
c0.3,0,0.6-0.1,0.9,0.1c-0.3-0.3-1-0.3-1.5-0.4c-0.5-0.4-1.1-1-1.4-1.4c1.3,0.3,2.8,0.1,3.6-0.5s1.3-1,1.8-0.9
c0.4,0.1,0.7-0.4,0.4-0.8c-0.3-0.4-1.2-1-2.3-0.7c-0.8,0.2-1.8,1.1-3.3,0.2c-1.3-0.8-1.3-1.4-1.3-1.8c0-0.3,0.2-0.7,0.5-0.8
c0.2,0.1,0.3,0.1,0.3,0.1s-0.1-0.1-0.1-0.2l0,0c0.1,0,0.4,0.2,0.6,0.2c0.2,0.1,0.3,0.2,0.3,0.2s0,0,0-0.1c0,0-0.1-0.2-0.3-0.3l0,0
c0.1,0,0.2,0.1,0.4,0.2c0-0.2,0.1-0.4,0.1-0.7c0-0.2,0-0.3-0.1-0.4c-0.1-0.1,0-0.1,0.1,0c0-0.1,0-0.1-0.1-0.2l0,0c0,0,0,0,0-0.1
c0.2-0.3,1.8-1.2,1.9-1.3c0.2-0.1,0.3-0.3,0.4-0.5c0.2-0.1,0.3-0.5,0.3-0.8c0-0.1-0.2-0.3-0.4-0.3c-0.1,0-0.4-0.1-0.6,0l0,0
c-0.3,0-0.7,0-1.2,0s-0.8-0.3-1-0.6c0-0.1-0.1-0.1-0.1-0.2c0-0.1-0.1-0.2-0.1-0.2c0.2-0.8,0.7-1.5,1.4-2.1c0,0-0.2,0-0.1,0
c0,0,0.3-0.2,0.4-0.2c0.1,0-0.3-0.1-0.6-0.1c-0.5,0.2-0.6,0.2-0.8,0.3c0.1-0.1,0.3-0.2,0.2-0.2c-0.3,0.1-0.7,0.4-1.1,0.6v-0.1
c-0.2,0.1-0.6,0.4-0.7,0.7c0-0.1,0-0.1,0-0.1c-0.1,0-0.2,0.2-0.3,0.3l0,0c-1.1-0.3-2-0.2-2.8,0c-0.2-0.1-0.6-0.5-0.9-1
c0,0,0,0.1-0.1,0.1c-0.1-0.4-0.3-0.9-0.3-1.3v-0.1c0,0-0.1,0.1-0.3,0.3c-0.1,0.2-0.2,0.3-0.2,0.5c0,0.1-0.1,0.2-0.1,0.2v-0.2
c0,0.1-0.1,0.2-0.2,0.3c0,0.2,0,0.3-0.1,0.4l0,0c0,0,0-0.2,0-0.1c-0.1,0.2-0.2,0.5-0.2,0.8c-0.1,0.3-0.1,0.5-0.1,0.8s0,0.7,0,1.2
c0,0.1,0,0.1,0,0.2c-0.3,0.4-0.5,0.7-0.6,0.9c-0.4,0.7-0.7,1.8-1,3.5c0,0,0.2-0.6,0.6-1.3l0,0c-0.3,0.9-0.5,2.3-0.4,4.4
c0-0.1,0.1-0.6,0.2-1.3c0.1,1.4,0.5,3.1,1.5,5c0.8,1.4,1.7,2.4,2.7,3.2c0.2,0.2,0.4,0.3,0.6,0.5c1.3,1,3.3,2.1,5,2.4
c-0.6-0.2-1-0.5-1-0.5s2,0.7,3.5,0.6c-0.5-0.1-0.6-0.3-0.6-0.3s4.2,0.2,6.4-1.5c0.5-0.4,0.8-0.8,0.9-1.2c0.6-0.4,1.3-0.8,2-1.6
c1.2-1.2,1.3-2.1,1.4-3v0.1C-14,55.2-14,54.9-14.1,54.7z"/>
</svg>

До

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

После

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

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

@ -1,36 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" id="aboutWordmark" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="270px" height="48px" viewBox="0 0 270 48" xml:space="preserve">
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg" width="270px" height="48px" viewBox="0 0 270 48">
<path fill="#fff" d="M75.5,11.8V7.9c0-2.2,1.2-3.5,3.1-3.5c1,0,1.8,0.3,3,0.9l1.8-3.5c-1.7-1-3.5-1.4-5.7-1.4
C73.2,0.3,70,2.8,70,8c0,2.3,0.2,3.7,0.2,3.7h-2.5v3.8H70V37h5.4V15.6h5.1l1.4-3.8H75.5z M92.3,11.2c-6.7,0-11,5.2-11,13.3
c0,8.1,4.3,13.2,11.1,13.2c6.8,0,11.2-5,11.2-13.2C103.6,16.5,99.5,11.2,92.3,11.2z M92.5,33.6c-3.3,0-5.1-2.1-5.1-9.5
c0-6.1,1.5-8.8,5-8.8c3.2,0,5.2,2.1,5.2,9.3C97.6,30.9,95.8,33.6,92.5,33.6z M43.7,11.1c-2.5,0-4.4,1.3-6.4,4c0-1.4-0.3-2.8-0.9-4
l-5,1.3c0.6,1.6,0.9,3.6,0.9,6.8V37h5.5V19.9c0.5-2,2.4-3.7,4.7-3.7c0.6,0,1,0.1,1.6,0.4l1.7-5.1C45,11.2,44.5,11.1,43.7,11.1z
M0,37h5.7V21.2h9.6v-4.6H5.7V7.2h11.8l0.7-4.7H0V37z M21.4,37h5.5V11.2l-5.5,1V37z M24.2,0.7c-2,0-3.6,1.6-3.6,3.7
c0,2,1.5,3.6,3.5,3.6c2,0,3.7-1.6,3.7-3.6C27.8,2.3,26.2,0.7,24.2,0.7z M125.2,11.8h-6.4c-0.7,1.1-3.3,6.1-4,7.7
c-1.2-2.3-3.4-6.3-4.6-8.2l-5.9,1.2l7.3,10.8L102.2,37h6.9c0.9-1.4,4.5-7.5,5.5-9.4c0.5,0.9,4.6,8,5.5,9.4h6.9l-9.2-13.8L125.2,11.8
z M62.7,13.8c-2.1-1.9-4.4-2.6-6.9-2.6c-3.2,0-5.7,1-7.7,3.4C45.9,17.1,45,20,45,24.5c0,8.1,4.5,13.2,11.6,13.2
c3.4,0,6.4-1.1,9.1-3.3L63.4,31c-1.9,1.6-3.9,2.5-6.3,2.5c-4.9,0-6.2-3.7-6.2-7.2v-0.4H66v-1.2C66,18.9,64.9,15.8,62.7,13.8z
M51,21.8c0-4.1,1.7-6.5,4.8-6.5c2.8,0,4.5,2.4,4.5,6.5H51z M198.5,14.3l-2.4-2.4c-1.2,0.8-2.2,1.1-3.5,1.1c-3,0-3.8-1.4-7.6-1.4
c-5.4,0-9.2,3.4-9.2,8.4c0,3.3,2.2,6.1,5.6,7.2c-3.4,1-4.5,2.2-4.5,4.3c0,2.2,1.8,3.6,4.7,3.6h3.8c2.5,0,3.9,0.2,4.9,0.9
c0.9,0.6,1.4,1.6,1.4,3c0,3.1-2.2,4.4-6,4.4c-2,0-3.8-0.5-5.1-1.2c-0.9-0.6-1.5-1.6-1.5-2.9c0-0.8,0.3-1.7,0.7-2.2l-4.1,0.4
c-0.3,1-0.5,1.7-0.5,2.6c0,3.5,3,6.4,10.8,6.4c6.1,0,9.9-2.5,9.9-7.9c0-2.1-0.8-3.9-2.7-5.3c-1.5-1.1-3.1-1.4-6-1.4h-4
c-1.3,0-2-0.5-2-1.2c0-0.8,1.1-1.7,4.5-2.9c1.8,0,3.4-0.3,4.7-1.1c2.3-1.4,3.7-4.1,3.7-6.8c0-1.6-0.5-3-1.5-4.3
c0.4,0.2,1.1,0.3,1.7,0.3C195.8,15.8,196.9,15.4,198.5,14.3z M185,24.8c-3.1,0-4.8-1.7-4.8-4.8c0-3.5,1.6-5.1,4.7-5.1
c3.3,0,4.6,1.5,4.6,4.9C189.5,23.1,188,24.8,185,24.8z M168.6,1.3c-1.7,0-3,1.4-3,3.1c0,1.7,1.4,3,3,3c1.7,0,3.1-1.3,3.1-3
C171.6,2.7,170.3,1.3,168.6,1.3z M245.7,34.5c-1.1,0-1.4-0.6-1.4-2.5V6.5c0-3.8-0.6-5.9-0.6-5.9l-3.9,0.8c0,0,0.6,1.9,0.6,5.1v26.4
c0,1.8,0.4,2.8,1.2,3.5c0.7,0.7,1.7,1,2.9,1c1,0,1.5-0.1,2.5-0.5l-0.8-2.5C246.2,34.4,245.8,34.5,245.7,34.5z M212.7,11.6
c-3.2,0-6.1,1.8-8.3,3.9c0,0,0.2-1.8,0.2-3.4V6.3c0-3.8-0.7-5.9-0.7-5.9L200,1.1c0,0,0.7,1.9,0.7,5.1V37h3.9V19.3
c2.1-2.7,4.9-4.2,7.2-4.2c1.3,0,2.3,0.4,2.9,1c0.7,0.7,0.9,1.8,0.9,3.7V37h3.8V19.1c0-1.8-0.1-2.6-0.4-3.6
C218.4,13.2,215.7,11.6,212.7,11.6z M265.4,12.1l-4.9,16.4c-0.6,2-1.6,5.2-1.6,5.2s-0.7-3.9-1.5-6.2l-5.1-16.2l-3.9,1.3l5.4,15.6
c0.8,2.5,2.2,7.4,2.5,9l1.6-0.3c-1.3,5.1-2.5,6.7-5.7,7.6l1.2,2.7c4.4-1,6.4-4.3,8-9.3l8.6-25.8H265.4z M234.9,15l1.2-2.9h-6.2
c0-3.3,0.5-7.2,0.5-7.2l-4.1,0.9c0,0-0.4,3.9-0.4,6.3h-3.2V15h3.2v17.1c0,2.5,0.7,4.1,2.4,5c0.9,0.4,1.9,0.7,3.3,0.7
c1.8,0,3.1-0.4,4.4-1l-0.6-2.5c-0.7,0.3-1.3,0.5-2.4,0.5c-2.4,0-3.2-0.9-3.2-3.7V15H234.9z M166.5,37h4.1V11.5l-4.1,0.6V37z
M156.8,21.3c0,5,0.4,10.5,0.4,10.5s-1.4-3.8-3.2-7.2L142.7,2.7h-4.8V37h4.2l-0.2-19.9c0-4.5-0.4-9.3-0.4-9.3s1.7,4.1,3.9,8.2l11,21
h4.3V2.7h-4L156.8,21.3z M128.3,12.9c-0.3-0.1-0.7-0.1-1-0.1v2.3h0.3v-1c0.3,0,0.7,1,0.7,1s0.2,0,0.4,0c-0.2-0.3-0.3-0.7-0.6-1
C128.8,14.1,128.9,13.1,128.3,12.9z M127.6,13.8v-0.7c0,0,0.7,0,0.7,0.3C128.3,13.9,127.8,13.9,127.6,13.8z M128,12
c-1.1,0-2,0.9-2,2s0.9,2,2,2s2-0.9,2-2S129.1,12,128,12z M128,15.5c-0.8,0-1.5-0.7-1.5-1.5s0.7-1.5,1.5-1.5s1.5,0.7,1.5,1.5
S128.8,15.5,128,15.5z"/>
C73.2,0.3,70,2.8,70,8c0,2.3,0.2,3.7,0.2,3.7h-2.5v3.8H70V37h5.4V15.6h5.1l1.4-3.8H75.5z M92.3,11.2c-6.7,0-11,5.2-11,13.3
c0,8.1,4.3,13.2,11.1,13.2c6.8,0,11.2-5,11.2-13.2C103.6,16.5,99.5,11.2,92.3,11.2z M92.5,33.6c-3.3,0-5.1-2.1-5.1-9.5
c0-6.1,1.5-8.8,5-8.8c3.2,0,5.2,2.1,5.2,9.3C97.6,30.9,95.8,33.6,92.5,33.6z M43.7,11.1c-2.5,0-4.4,1.3-6.4,4c0-1.4-0.3-2.8-0.9-4
l-5,1.3c0.6,1.6,0.9,3.6,0.9,6.8V37h5.5V19.9c0.5-2,2.4-3.7,4.7-3.7c0.6,0,1,0.1,1.6,0.4l1.7-5.1C45,11.2,44.5,11.1,43.7,11.1z
M0,37h5.7V21.2h9.6v-4.6H5.7V7.2h11.8l0.7-4.7H0V37z M21.4,37h5.5V11.2l-5.5,1V37z M24.2,0.7c-2,0-3.6,1.6-3.6,3.7
c0,2,1.5,3.6,3.5,3.6c2,0,3.7-1.6,3.7-3.6C27.8,2.3,26.2,0.7,24.2,0.7z M125.2,11.8h-6.4c-0.7,1.1-3.3,6.1-4,7.7
c-1.2-2.3-3.4-6.3-4.6-8.2l-5.9,1.2l7.3,10.8L102.2,37h6.9c0.9-1.4,4.5-7.5,5.5-9.4c0.5,0.9,4.6,8,5.5,9.4h6.9l-9.2-13.8L125.2,11.8
z M62.7,13.8c-2.1-1.9-4.4-2.6-6.9-2.6c-3.2,0-5.7,1-7.7,3.4C45.9,17.1,45,20,45,24.5c0,8.1,4.5,13.2,11.6,13.2
c3.4,0,6.4-1.1,9.1-3.3L63.4,31c-1.9,1.6-3.9,2.5-6.3,2.5c-4.9,0-6.2-3.7-6.2-7.2v-0.4H66v-1.2C66,18.9,64.9,15.8,62.7,13.8z
M51,21.8c0-4.1,1.7-6.5,4.8-6.5c2.8,0,4.5,2.4,4.5,6.5H51z M198.5,14.3l-2.4-2.4c-1.2,0.8-2.2,1.1-3.5,1.1c-3,0-3.8-1.4-7.6-1.4
c-5.4,0-9.2,3.4-9.2,8.4c0,3.3,2.2,6.1,5.6,7.2c-3.4,1-4.5,2.2-4.5,4.3c0,2.2,1.8,3.6,4.7,3.6h3.8c2.5,0,3.9,0.2,4.9,0.9
c0.9,0.6,1.4,1.6,1.4,3c0,3.1-2.2,4.4-6,4.4c-2,0-3.8-0.5-5.1-1.2c-0.9-0.6-1.5-1.6-1.5-2.9c0-0.8,0.3-1.7,0.7-2.2l-4.1,0.4
c-0.3,1-0.5,1.7-0.5,2.6c0,3.5,3,6.4,10.8,6.4c6.1,0,9.9-2.5,9.9-7.9c0-2.1-0.8-3.9-2.7-5.3c-1.5-1.1-3.1-1.4-6-1.4h-4
c-1.3,0-2-0.5-2-1.2c0-0.8,1.1-1.7,4.5-2.9c1.8,0,3.4-0.3,4.7-1.1c2.3-1.4,3.7-4.1,3.7-6.8c0-1.6-0.5-3-1.5-4.3
c0.4,0.2,1.1,0.3,1.7,0.3C195.8,15.8,196.9,15.4,198.5,14.3z M185,24.8c-3.1,0-4.8-1.7-4.8-4.8c0-3.5,1.6-5.1,4.7-5.1
c3.3,0,4.6,1.5,4.6,4.9C189.5,23.1,188,24.8,185,24.8z M168.6,1.3c-1.7,0-3,1.4-3,3.1c0,1.7,1.4,3,3,3c1.7,0,3.1-1.3,3.1-3
C171.6,2.7,170.3,1.3,168.6,1.3z M245.7,34.5c-1.1,0-1.4-0.6-1.4-2.5V6.5c0-3.8-0.6-5.9-0.6-5.9l-3.9,0.8c0,0,0.6,1.9,0.6,5.1v26.4
c0,1.8,0.4,2.8,1.2,3.5c0.7,0.7,1.7,1,2.9,1c1,0,1.5-0.1,2.5-0.5l-0.8-2.5C246.2,34.4,245.8,34.5,245.7,34.5z M212.7,11.6
c-3.2,0-6.1,1.8-8.3,3.9c0,0,0.2-1.8,0.2-3.4V6.3c0-3.8-0.7-5.9-0.7-5.9L200,1.1c0,0,0.7,1.9,0.7,5.1V37h3.9V19.3
c2.1-2.7,4.9-4.2,7.2-4.2c1.3,0,2.3,0.4,2.9,1c0.7,0.7,0.9,1.8,0.9,3.7V37h3.8V19.1c0-1.8-0.1-2.6-0.4-3.6
C218.4,13.2,215.7,11.6,212.7,11.6z M265.4,12.1l-4.9,16.4c-0.6,2-1.6,5.2-1.6,5.2s-0.7-3.9-1.5-6.2l-5.1-16.2l-3.9,1.3l5.4,15.6
c0.8,2.5,2.2,7.4,2.5,9l1.6-0.3c-1.3,5.1-2.5,6.7-5.7,7.6l1.2,2.7c4.4-1,6.4-4.3,8-9.3l8.6-25.8H265.4z M234.9,15l1.2-2.9h-6.2
c0-3.3,0.5-7.2,0.5-7.2l-4.1,0.9c0,0-0.4,3.9-0.4,6.3h-3.2V15h3.2v17.1c0,2.5,0.7,4.1,2.4,5c0.9,0.4,1.9,0.7,3.3,0.7
c1.8,0,3.1-0.4,4.4-1l-0.6-2.5c-0.7,0.3-1.3,0.5-2.4,0.5c-2.4,0-3.2-0.9-3.2-3.7V15H234.9z M166.5,37h4.1V11.5l-4.1,0.6V37z
M156.8,21.3c0,5,0.4,10.5,0.4,10.5s-1.4-3.8-3.2-7.2L142.7,2.7h-4.8V37h4.2l-0.2-19.9c0-4.5-0.4-9.3-0.4-9.3s1.7,4.1,3.9,8.2l11,21
h4.3V2.7h-4L156.8,21.3z M128.3,12.9c-0.3-0.1-0.7-0.1-1-0.1v2.3h0.3v-1c0.3,0,0.7,1,0.7,1s0.2,0,0.4,0c-0.2-0.3-0.3-0.7-0.6-1
C128.8,14.1,128.9,13.1,128.3,12.9z M127.6,13.8v-0.7c0,0,0.7,0,0.7,0.3C128.3,13.9,127.8,13.9,127.6,13.8z M128,12
c-1.1,0-2,0.9-2,2s0.9,2,2,2s2-0.9,2-2S129.1,12,128,12z M128,15.5c-0.8,0-1.5-0.7-1.5-1.5s0.7-1.5,1.5-1.5s1.5,0.7,1.5,1.5
S128.8,15.5,128,15.5z"/>
</svg>

До

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

После

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

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

@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1"
xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="-45 31 40 40"
enable-background="new -45 31 40 40">
<path fill="#CCCCCC" d="M-25,62.991c-6.622,0-11.991-5.369-11.991-11.991S-31.622,39.009-25,39.009S-13.009,44.378-13.009,51
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-45 31 40 40">
<path fill="#ccc" d="M-25,62.991c-6.622,0-11.991-5.369-11.991-11.991S-31.622,39.009-25,39.009S-13.009,44.378-13.009,51
S-18.378,62.991-25,62.991z M-34.439,48.549c-0.002,0.007-0.004,0.013-0.006,0.02c0.002-0.004,0.006-0.006,0.007-0.01
C-34.437,48.555-34.438,48.552-34.439,48.549z M-34.259,47.956c-0.001-0.006-0.003-0.005-0.002-0.012l0,0
c-0.001,0.004-0.003,0.008-0.004,0.012l0.008,0.006C-34.258,47.96-34.258,47.958-34.259,47.956z M-34.245,48.067

До

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

После

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

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

@ -1,23 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" id="aboutWordmark" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="130px" height="38px" viewBox="0 0 130 38" xml:space="preserve">
<path fill="#55575C" d="M128.4,14.4c0,0-0.1-0.1-0.1-0.1c0,0-0.1-0.1-0.1-0.1c0,0-0.1-0.1-0.1-0.1c0.2,0,0.3-0.1,0.4-0.2
c0.1-0.1,0.1-0.3,0.1-0.4c0-0.1,0-0.2,0-0.2c0-0.1-0.1-0.1-0.1-0.2c-0.1-0.1-0.1-0.1-0.2-0.1c-0.1,0-0.2-0.1-0.3-0.1h-0.7v2.2h0.4
v-1c0,0,0.1,0,0.1,0c0,0,0,0,0.1,0.1c0.1,0.1,0.1,0.1,0.2,0.2c0.1,0.1,0.1,0.2,0.2,0.3l0.2,0.4h0.4l-0.3-0.5
C128.4,14.5,128.4,14.5,128.4,14.4z M127.8,13.9h-0.2v-0.7h0.2c0.2,0,0.3,0,0.4,0.1c0.1,0.1,0.1,0.1,0.1,0.3c0,0.1,0,0.2-0.1,0.3
c0,0-0.1,0.1-0.1,0.1C128,13.9,127.9,13.9,127.8,13.9z M0,37h5.7V21.2h9.6v-4.6H5.7V7.2h11.8l0.7-4.7H0V37z M24.2,0.7
c-2,0-3.6,1.6-3.6,3.7c0,2,1.5,3.6,3.5,3.6c2,0,3.7-1.6,3.7-3.6C27.8,2.3,26.2,0.7,24.2,0.7z M21.4,37h5.5V11.2l-5.5,1V37z
M43.7,11.1c-2.5,0-4.4,1.3-6.4,4c0-1.4-0.3-2.8-0.9-4l-5,1.3c0.6,1.6,0.9,3.6,0.9,6.8V37h5.5V19.9c0.5-2,2.4-3.7,4.7-3.7
c0.6,0,1,0.1,1.6,0.4l1.7-5.1C45,11.2,44.5,11.1,43.7,11.1z M62.7,13.8c-2.1-1.9-4.4-2.6-6.9-2.6c-3.2,0-5.7,1-7.7,3.4
c-2.2,2.5-3.1,5.4-3.1,9.9c0,8.1,4.5,13.2,11.6,13.2c3.4,0,6.4-1.1,9.1-3.3L63.4,31c-1.9,1.6-3.9,2.5-6.3,2.5
c-4.9,0-6.2-3.7-6.2-7.2v-0.4H66v-1.2C66,18.9,64.9,15.8,62.7,13.8z M51,21.8c0-4.1,1.7-6.5,4.8-6.5c2.8,0,4.5,2.4,4.5,6.5H51z
M75.5,11.8V7.9c0-2.2,1.2-3.5,3.1-3.5c1,0,1.8,0.3,3,0.9l1.8-3.5c-1.7-1-3.5-1.4-5.7-1.4C73.2,0.3,70,2.8,70,8
c0,2.3,0.2,3.7,0.2,3.7h-2.5v3.8h2.3V37h5.4V15.6h5.1l1.4-3.8H75.5z M92.3,11.2c-6.7,0-11,5.2-11,13.3c0,8.1,4.3,13.2,11.1,13.2
c6.8,0,11.2-5,11.2-13.2C103.6,16.5,99.5,11.2,92.3,11.2z M92.5,33.6c-3.3,0-5.1-2.1-5.1-9.5c0-6.1,1.5-8.8,5-8.8
c3.2,0,5.2,2.1,5.2,9.3C97.6,30.9,95.8,33.6,92.5,33.6z M125.2,11.8h-6.4c-0.7,1.1-3.3,6.1-4,7.7c-1.2-2.3-3.4-6.3-4.6-8.2l-5.9,1.2
l7.3,10.8L102.2,37h6.9c0.9-1.4,4.5-7.5,5.5-9.4c0.5,0.9,4.6,8,5.5,9.4h6.9l-9.2-13.8L125.2,11.8z M128,12c-1.1,0-2,0.9-2,2
s0.9,2,2,2c1.1,0,2-0.9,2-2S129.1,12,128,12z M128,15.5c-0.8,0-1.5-0.7-1.5-1.5s0.7-1.5,1.5-1.5c0.8,0,1.5,0.7,1.5,1.5
S128.8,15.5,128,15.5z"/>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg" width="130px" height="38px" viewBox="0 0 130 38">
<path fill="#55575c" d="M128.4,14.4c0,0-0.1-0.1-0.1-0.1c0,0-0.1-0.1-0.1-0.1c0,0-0.1-0.1-0.1-0.1c0.2,0,0.3-0.1,0.4-0.2
c0.1-0.1,0.1-0.3,0.1-0.4c0-0.1,0-0.2,0-0.2c0-0.1-0.1-0.1-0.1-0.2c-0.1-0.1-0.1-0.1-0.2-0.1c-0.1,0-0.2-0.1-0.3-0.1h-0.7v2.2h0.4
v-1c0,0,0.1,0,0.1,0c0,0,0,0,0.1,0.1c0.1,0.1,0.1,0.1,0.2,0.2c0.1,0.1,0.1,0.2,0.2,0.3l0.2,0.4h0.4l-0.3-0.5
C128.4,14.5,128.4,14.5,128.4,14.4z M127.8,13.9h-0.2v-0.7h0.2c0.2,0,0.3,0,0.4,0.1c0.1,0.1,0.1,0.1,0.1,0.3c0,0.1,0,0.2-0.1,0.3
c0,0-0.1,0.1-0.1,0.1C128,13.9,127.9,13.9,127.8,13.9z M0,37h5.7V21.2h9.6v-4.6H5.7V7.2h11.8l0.7-4.7H0V37z M24.2,0.7
c-2,0-3.6,1.6-3.6,3.7c0,2,1.5,3.6,3.5,3.6c2,0,3.7-1.6,3.7-3.6C27.8,2.3,26.2,0.7,24.2,0.7z M21.4,37h5.5V11.2l-5.5,1V37z
M43.7,11.1c-2.5,0-4.4,1.3-6.4,4c0-1.4-0.3-2.8-0.9-4l-5,1.3c0.6,1.6,0.9,3.6,0.9,6.8V37h5.5V19.9c0.5-2,2.4-3.7,4.7-3.7
c0.6,0,1,0.1,1.6,0.4l1.7-5.1C45,11.2,44.5,11.1,43.7,11.1z M62.7,13.8c-2.1-1.9-4.4-2.6-6.9-2.6c-3.2,0-5.7,1-7.7,3.4
c-2.2,2.5-3.1,5.4-3.1,9.9c0,8.1,4.5,13.2,11.6,13.2c3.4,0,6.4-1.1,9.1-3.3L63.4,31c-1.9,1.6-3.9,2.5-6.3,2.5
c-4.9,0-6.2-3.7-6.2-7.2v-0.4H66v-1.2C66,18.9,64.9,15.8,62.7,13.8z M51,21.8c0-4.1,1.7-6.5,4.8-6.5c2.8,0,4.5,2.4,4.5,6.5H51z
M75.5,11.8V7.9c0-2.2,1.2-3.5,3.1-3.5c1,0,1.8,0.3,3,0.9l1.8-3.5c-1.7-1-3.5-1.4-5.7-1.4C73.2,0.3,70,2.8,70,8
c0,2.3,0.2,3.7,0.2,3.7h-2.5v3.8h2.3V37h5.4V15.6h5.1l1.4-3.8H75.5z M92.3,11.2c-6.7,0-11,5.2-11,13.3c0,8.1,4.3,13.2,11.1,13.2
c6.8,0,11.2-5,11.2-13.2C103.6,16.5,99.5,11.2,92.3,11.2z M92.5,33.6c-3.3,0-5.1-2.1-5.1-9.5c0-6.1,1.5-8.8,5-8.8
c3.2,0,5.2,2.1,5.2,9.3C97.6,30.9,95.8,33.6,92.5,33.6z M125.2,11.8h-6.4c-0.7,1.1-3.3,6.1-4,7.7c-1.2-2.3-3.4-6.3-4.6-8.2l-5.9,1.2
l7.3,10.8L102.2,37h6.9c0.9-1.4,4.5-7.5,5.5-9.4c0.5,0.9,4.6,8,5.5,9.4h6.9l-9.2-13.8L125.2,11.8z M128,12c-1.1,0-2,0.9-2,2
s0.9,2,2,2c1.1,0,2-0.9,2-2S129.1,12,128,12z M128,15.5c-0.8,0-1.5-0.7-1.5-1.5s0.7-1.5,1.5-1.5c0.8,0,1.5,0.7,1.5,1.5
S128.8,15.5,128,15.5z"/>
</svg>

До

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

После

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

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

@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1"
xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="-45 31 40 40"
enable-background="new -45 31 40 40">
<path fill="#CCCCCC" d="M-14.1,54.7c0.7-1.4,1.7-4.4,0.8-6.9c0,0,0,0,0,0.1l0,0c0,0-0.2,0.5-0.4,1.3c0-0.1,0-0.2,0-0.3
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-45 31 40 40">
<path fill="#ccc" d="M-14.1,54.7c0.7-1.4,1.7-4.4,0.8-6.9c0,0,0,0,0,0.1l0,0c0,0-0.2,0.5-0.4,1.3c0-0.1,0-0.2,0-0.3
c0.1-0.9,0-1.9-0.1-2.9c-0.3-1.5-1.4-2.8-2-3.2c0,0,0.1,0,0.1,0.1c-0.1-0.1-0.1-0.1-0.1-0.1s0,0.1,0.1,0.4c-0.7-1.1-1.6-1.5-1.6-1.5
s0,0.2,0.1,0.5c-2-1.9-4.7-3-7.6-3c-3,0-5.7,1.2-7.8,3.1c0.1,0.1,0.2,0.3,0.4,0.5c0,0,0.8-0.1,1.7-0.1c1.7-1.2,3.6-1.8,5.7-1.8
c2.6,0,5.1,1.1,7,3c-0.2-0.1-0.1,0,0,0.1c-0.6-0.4-1.2-0.8-1.7-0.8c1,0.8,2.6,2.7,2.4,6.2c-0.3-0.6-0.6-1-0.9-1.3

До

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

После

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

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

@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" id="aboutWordmark" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="132px" height="48px" viewBox="0 0 132 48" xml:space="preserve">
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg" width="132px" height="48px" viewBox="0 0 132 48">
<path fill="#fff" d="M60.6,14.3l-2.4-2.4C57,12.7,56,13,54.7,13c-3,0-3.8-1.4-7.6-1.4c-5.4,0-9.2,3.4-9.2,8.4
c0,3.3,2.2,6.1,5.6,7.2c-3.4,1-4.5,2.2-4.5,4.3c0,2.2,1.8,3.6,4.7,3.6h3.8c2.5,0,3.9,0.2,4.9,0.9c0.9,0.6,1.4,1.6,1.4,3
c0,3.1-2.2,4.4-6,4.4c-2,0-3.8-0.5-5.1-1.2c-0.9-0.6-1.5-1.6-1.5-2.9c0-0.8,0.3-1.7,0.7-2.2l-4.1,0.4c-0.3,1-0.5,1.7-0.5,2.6
c0,3.5,3,6.4,10.8,6.4c6.1,0,9.9-2.5,9.9-7.9c0-2.1-0.8-3.9-2.7-5.3c-1.5-1.1-3.1-1.4-6-1.4h-4c-1.3,0-2-0.5-2-1.2
c0-0.8,1.1-1.7,4.5-2.9c1.8,0,3.4-0.3,4.7-1.1c2.3-1.4,3.7-4.1,3.7-6.8c0-1.6-0.5-3-1.5-4.3c0.4,0.2,1.1,0.3,1.7,0.3
C57.9,15.8,59,15.4,60.6,14.3z M47.1,24.8c-3.1,0-4.8-1.7-4.8-4.8c0-3.5,1.6-5.1,4.7-5.1c3.3,0,4.6,1.5,4.6,4.9
C51.6,23.1,50.1,24.8,47.1,24.8z M30.7,1.3c-1.7,0-3,1.4-3,3.1s1.4,3,3,3c1.7,0,3.1-1.3,3.1-3C33.7,2.7,32.4,1.3,30.7,1.3z
M107.7,34.5c-1.1,0-1.4-0.6-1.4-2.5V6.5c0-3.8-0.6-5.9-0.6-5.9l-3.9,0.8c0,0,0.6,1.9,0.6,5.1v26.4c0,1.8,0.4,2.8,1.2,3.5
c0.7,0.7,1.7,1,2.9,1c1,0,1.5-0.1,2.5-0.5l-0.8-2.5C108.2,34.4,107.8,34.5,107.7,34.5z M74.7,11.6c-3.2,0-6.1,1.8-8.3,3.9
c0,0,0.2-1.8,0.2-3.4V6.3c0-3.8-0.7-5.9-0.7-5.9l-3.9,0.7c0,0,0.7,1.9,0.7,5.1V37h3.9V19.3c2.1-2.7,4.9-4.2,7.2-4.2
c1.3,0,2.3,0.4,2.9,1c0.7,0.7,0.9,1.8,0.9,3.7V37h3.8V19.1c0-1.8-0.1-2.6-0.4-3.6C80.4,13.2,77.7,11.6,74.7,11.6z M127.4,12.1
l-4.9,16.4c-0.6,2-1.6,5.2-1.6,5.2s-0.7-3.9-1.5-6.2l-5.1-16.2l-3.9,1.3l5.4,15.6c0.8,2.5,2.2,7.4,2.5,9l1.6-0.3
c-1.3,5.1-2.5,6.7-5.7,7.6l1.2,2.7c4.4-1,6.4-4.3,8-9.3l8.6-25.8H127.4z M96.9,15l1.2-2.9h-6.2c0-3.3,0.5-7.2,0.5-7.2l-4.1,0.9
c0,0-0.4,3.9-0.4,6.3h-3.2V15h3.2v17.1c0,2.5,0.7,4.1,2.4,5c0.9,0.4,1.9,0.7,3.3,0.7c1.8,0,3.1-0.4,4.4-1l-0.6-2.5
c-0.7,0.3-1.3,0.5-2.4,0.5c-2.4,0-3.2-0.9-3.2-3.7V15H96.9z M28.6,37h4.1V11.5l-4.1,0.6V37z M18.9,21.3c0,5,0.4,10.5,0.4,10.5
s-1.4-3.8-3.2-7.2L4.8,2.7H0V37h4.2L4,17.1c0-4.5-0.4-9.3-0.4-9.3s1.7,4.1,3.9,8.2l11,21h4.3V2.7h-4L18.9,21.3z"/>
c0,3.3,2.2,6.1,5.6,7.2c-3.4,1-4.5,2.2-4.5,4.3c0,2.2,1.8,3.6,4.7,3.6h3.8c2.5,0,3.9,0.2,4.9,0.9c0.9,0.6,1.4,1.6,1.4,3
c0,3.1-2.2,4.4-6,4.4c-2,0-3.8-0.5-5.1-1.2c-0.9-0.6-1.5-1.6-1.5-2.9c0-0.8,0.3-1.7,0.7-2.2l-4.1,0.4c-0.3,1-0.5,1.7-0.5,2.6
c0,3.5,3,6.4,10.8,6.4c6.1,0,9.9-2.5,9.9-7.9c0-2.1-0.8-3.9-2.7-5.3c-1.5-1.1-3.1-1.4-6-1.4h-4c-1.3,0-2-0.5-2-1.2
c0-0.8,1.1-1.7,4.5-2.9c1.8,0,3.4-0.3,4.7-1.1c2.3-1.4,3.7-4.1,3.7-6.8c0-1.6-0.5-3-1.5-4.3c0.4,0.2,1.1,0.3,1.7,0.3
C57.9,15.8,59,15.4,60.6,14.3z M47.1,24.8c-3.1,0-4.8-1.7-4.8-4.8c0-3.5,1.6-5.1,4.7-5.1c3.3,0,4.6,1.5,4.6,4.9
C51.6,23.1,50.1,24.8,47.1,24.8z M30.7,1.3c-1.7,0-3,1.4-3,3.1s1.4,3,3,3c1.7,0,3.1-1.3,3.1-3C33.7,2.7,32.4,1.3,30.7,1.3z
M107.7,34.5c-1.1,0-1.4-0.6-1.4-2.5V6.5c0-3.8-0.6-5.9-0.6-5.9l-3.9,0.8c0,0,0.6,1.9,0.6,5.1v26.4c0,1.8,0.4,2.8,1.2,3.5
c0.7,0.7,1.7,1,2.9,1c1,0,1.5-0.1,2.5-0.5l-0.8-2.5C108.2,34.4,107.8,34.5,107.7,34.5z M74.7,11.6c-3.2,0-6.1,1.8-8.3,3.9
c0,0,0.2-1.8,0.2-3.4V6.3c0-3.8-0.7-5.9-0.7-5.9l-3.9,0.7c0,0,0.7,1.9,0.7,5.1V37h3.9V19.3c2.1-2.7,4.9-4.2,7.2-4.2
c1.3,0,2.3,0.4,2.9,1c0.7,0.7,0.9,1.8,0.9,3.7V37h3.8V19.1c0-1.8-0.1-2.6-0.4-3.6C80.4,13.2,77.7,11.6,74.7,11.6z M127.4,12.1
l-4.9,16.4c-0.6,2-1.6,5.2-1.6,5.2s-0.7-3.9-1.5-6.2l-5.1-16.2l-3.9,1.3l5.4,15.6c0.8,2.5,2.2,7.4,2.5,9l1.6-0.3
c-1.3,5.1-2.5,6.7-5.7,7.6l1.2,2.7c4.4-1,6.4-4.3,8-9.3l8.6-25.8H127.4z M96.9,15l1.2-2.9h-6.2c0-3.3,0.5-7.2,0.5-7.2l-4.1,0.9
c0,0-0.4,3.9-0.4,6.3h-3.2V15h3.2v17.1c0,2.5,0.7,4.1,2.4,5c0.9,0.4,1.9,0.7,3.3,0.7c1.8,0,3.1-0.4,4.4-1l-0.6-2.5
c-0.7,0.3-1.3,0.5-2.4,0.5c-2.4,0-3.2-0.9-3.2-3.7V15H96.9z M28.6,37h4.1V11.5l-4.1,0.6V37z M18.9,21.3c0,5,0.4,10.5,0.4,10.5
s-1.4-3.8-3.2-7.2L4.8,2.7H0V37h4.2L4,17.1c0-4.5-0.4-9.3-0.4-9.3s1.7,4.1,3.9,8.2l11,21h4.3V2.7h-4L18.9,21.3z"/>
</svg>

До

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

После

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

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

@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1"
xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="-45 31 40 40"
enable-background="new -45 31 40 40">
<path fill="#CCCCCC" d="M-25,62.991c-6.622,0-11.991-5.369-11.991-11.991S-31.622,39.009-25,39.009S-13.009,44.378-13.009,51
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-45 31 40 40">
<path fill="#ccc" d="M-25,62.991c-6.622,0-11.991-5.369-11.991-11.991S-31.622,39.009-25,39.009S-13.009,44.378-13.009,51
S-18.378,62.991-25,62.991z M-34.439,48.549c-0.002,0.007-0.004,0.013-0.006,0.02c0.002-0.004,0.006-0.006,0.007-0.01
C-34.437,48.555-34.438,48.552-34.439,48.549z M-34.259,47.956c-0.001-0.006-0.003-0.005-0.002-0.012l0,0
c-0.001,0.004-0.003,0.008-0.004,0.012l0.008,0.006C-34.258,47.96-34.258,47.958-34.259,47.956z M-34.245,48.067

До

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

После

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

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

@ -1208,7 +1208,7 @@ DownloadsPlacesView.prototype = {
Cc["@mozilla.org/widget/clipboardhelper;1"]
.getService(Ci.nsIClipboardHelper)
.copyString(urls.join("\n"), document);
.copyString(urls.join("\n"));
},
_getURLFromClipboardData() {

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

@ -1262,7 +1262,7 @@ DownloadsViewItemController.prototype = {
downloadsCmd_copyLocation() {
let clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"]
.getService(Ci.nsIClipboardHelper);
clipboard.copyString(this.download.source.url, document);
clipboard.copyString(this.download.source.url);
},
downloadsCmd_doDefault() {

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

@ -18,6 +18,7 @@ content/js/conversationViews.js
content/js/panel.js
content/js/roomViews.js
content/shared/js/feedbackViews.js
content/shared/js/textChatView.js
content/shared/js/views.js
standalone/content/js/fxOSMarketplace.js
standalone/content/js/standaloneRoomViews.js

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

@ -60,7 +60,7 @@
"no-unused-vars": 0, // TODO: Remove (use default)
"no-use-before-define": 0, // TODO: Remove (use default)
"no-wrap-func": 0, // TODO: Remove (use default)
"quotes": 0, // [2, "double", "avoid-escape"],
"quotes": [2, "double", "avoid-escape"],
"strict": 0, // [2, "function"],
// eslint-plugin-react rules. These are documented at
// <https://github.com/yannickcr/eslint-plugin-react#list-of-supported-rules>

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

@ -40,6 +40,8 @@
<script type="text/javascript" src="loop/shared/js/feedbackStore.js"></script>
<script type="text/javascript" src="loop/shared/js/views.js"></script>
<script type="text/javascript" src="loop/shared/js/feedbackViews.js"></script>
<script type="text/javascript" src="loop/shared/js/textChatStore.js"></script>
<script type="text/javascript" src="loop/shared/js/textChatView.js"></script>
<script type="text/javascript" src="loop/js/conversationViews.js"></script>
<script type="text/javascript" src="loop/shared/js/websocket.js"></script>
<script type="text/javascript" src="loop/js/conversationAppStore.js"></script>

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

@ -86,10 +86,14 @@ loop.conversation = (function(mozL10n) {
}
});
// We want data channels only if the text chat preference is enabled.
var useDataChannels = loop.shared.utils.getBoolPreference("textChat.enabled");
var dispatcher = new loop.Dispatcher();
var client = new loop.Client();
var sdkDriver = new loop.OTSdkDriver({
isDesktop: true,
useDataChannels: useDataChannels,
dispatcher: dispatcher,
sdk: OT,
mozLoop: navigator.mozLoop
@ -130,11 +134,15 @@ loop.conversation = (function(mozL10n) {
var feedbackStore = new loop.store.FeedbackStore(dispatcher, {
feedbackClient: feedbackClient
});
var textChatStore = new loop.store.TextChatStore(dispatcher, {
sdkDriver: sdkDriver
});
loop.store.StoreMixin.register({
conversationAppStore: conversationAppStore,
conversationStore: conversationStore,
feedbackStore: feedbackStore
feedbackStore: feedbackStore,
textChatStore: textChatStore
});
// Obtain the windowId and pass it through
@ -153,8 +161,7 @@ loop.conversation = (function(mozL10n) {
React.render(React.createElement(AppControllerView, {
roomStore: roomStore,
dispatcher: dispatcher,
mozLoop: navigator.mozLoop}
), document.querySelector('#main'));
mozLoop: navigator.mozLoop}), document.querySelector("#main"));
document.body.setAttribute("dir", mozL10n.getDirection());
document.body.setAttribute("platform", loop.shared.utils.getPlatform());
@ -178,4 +185,4 @@ loop.conversation = (function(mozL10n) {
};
})(document.mozL10n);
document.addEventListener('DOMContentLoaded', loop.conversation.init);
document.addEventListener("DOMContentLoaded", loop.conversation.init);

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

@ -86,10 +86,14 @@ loop.conversation = (function(mozL10n) {
}
});
// We want data channels only if the text chat preference is enabled.
var useDataChannels = loop.shared.utils.getBoolPreference("textChat.enabled");
var dispatcher = new loop.Dispatcher();
var client = new loop.Client();
var sdkDriver = new loop.OTSdkDriver({
isDesktop: true,
useDataChannels: useDataChannels,
dispatcher: dispatcher,
sdk: OT,
mozLoop: navigator.mozLoop
@ -130,11 +134,15 @@ loop.conversation = (function(mozL10n) {
var feedbackStore = new loop.store.FeedbackStore(dispatcher, {
feedbackClient: feedbackClient
});
var textChatStore = new loop.store.TextChatStore(dispatcher, {
sdkDriver: sdkDriver
});
loop.store.StoreMixin.register({
conversationAppStore: conversationAppStore,
conversationStore: conversationStore,
feedbackStore: feedbackStore
feedbackStore: feedbackStore,
textChatStore: textChatStore
});
// Obtain the windowId and pass it through
@ -153,8 +161,7 @@ loop.conversation = (function(mozL10n) {
React.render(<AppControllerView
roomStore={roomStore}
dispatcher={dispatcher}
mozLoop={navigator.mozLoop}
/>, document.querySelector('#main'));
mozLoop={navigator.mozLoop} />, document.querySelector("#main"));
document.body.setAttribute("dir", mozL10n.getDirection());
document.body.setAttribute("platform", loop.shared.utils.getPlatform());
@ -178,4 +185,4 @@ loop.conversation = (function(mozL10n) {
};
})(document.mozL10n);
document.addEventListener('DOMContentLoaded', loop.conversation.init);
document.addEventListener("DOMContentLoaded", loop.conversation.init);

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

@ -163,7 +163,7 @@ loop.conversationViews = (function(mozL10n) {
clickHandler: function(e) {
var target = e.target;
if (!target.classList.contains('btn-chevron')) {
if (!target.classList.contains("btn-chevron")) {
this._hideDeclineMenu();
}
},

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

@ -163,7 +163,7 @@ loop.conversationViews = (function(mozL10n) {
clickHandler: function(e) {
var target = e.target;
if (!target.classList.contains('btn-chevron')) {
if (!target.classList.contains("btn-chevron")) {
this._hideDeclineMenu();
}
},

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

@ -3,8 +3,8 @@
* You can obtain one at http://mozilla.org/MPL/2.0/. */
window.OTProperties = {
cdnURL: 'loop/'
cdnURL: "loop/"
};
window.OTProperties.assetURL = window.OTProperties.cdnURL + 'sdk-content/';
window.OTProperties.configURL = window.OTProperties.assetURL + 'js/dynamic_config.min.js';
window.OTProperties.cssURL = window.OTProperties.assetURL + 'css/ot.css';
window.OTProperties.assetURL = window.OTProperties.cdnURL + "sdk-content/";
window.OTProperties.configURL = window.OTProperties.assetURL + "js/dynamic_config.min.js";
window.OTProperties.cssURL = window.OTProperties.assetURL + "css/ot.css";

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

@ -128,11 +128,11 @@ loop.panel = (function(_, mozL10n) {
return function(event) {
// Note: side effect!
switch (newAvailabilty) {
case 'available':
case "available":
this.setState({doNotDisturb: false});
navigator.mozLoop.doNotDisturb = false;
break;
case 'do-not-disturb':
case "do-not-disturb":
this.setState({doNotDisturb: true});
navigator.mozLoop.doNotDisturb = true;
break;
@ -145,13 +145,13 @@ loop.panel = (function(_, mozL10n) {
// XXX https://github.com/facebook/react/issues/310 for === htmlFor
var cx = React.addons.classSet;
var availabilityStatus = cx({
'status': true,
'status-dnd': this.state.doNotDisturb,
'status-available': !this.state.doNotDisturb
"status": true,
"status-dnd": this.state.doNotDisturb,
"status-available": !this.state.doNotDisturb
});
var availabilityDropdown = cx({
'dropdown-menu': true,
'hide': !this.state.showMenu
"dropdown-menu": true,
"hide": !this.state.showMenu
});
var availabilityText = this.state.doNotDisturb ?
mozL10n.get("display_name_dnd_status") :
@ -289,7 +289,7 @@ loop.panel = (function(_, mozL10n) {
}
var locale = mozL10n.getLanguage();
navigator.mozLoop.setLoopPref('showPartnerLogo', false);
navigator.mozLoop.setLoopPref("showPartnerLogo", false);
return (
React.createElement("p", {id: "powered-by", className: "powered-by"},
mozL10n.get("powered_by_beforeLogo"),
@ -301,8 +301,8 @@ loop.panel = (function(_, mozL10n) {
render: function() {
if (!this.state.gettingStartedSeen || this.state.seenToS == "unseen") {
var terms_of_use_url = navigator.mozLoop.getLoopPref('legal.ToS_url');
var privacy_notice_url = navigator.mozLoop.getLoopPref('legal.privacy_url');
var terms_of_use_url = navigator.mozLoop.getLoopPref("legal.ToS_url");
var privacy_notice_url = navigator.mozLoop.getLoopPref("legal.privacy_url");
var tosHTML = mozL10n.get("legal_text_and_links3", {
"clientShortname": mozL10n.get("clientShortname2"),
"terms_of_use": React.renderToStaticMarkup(
@ -700,7 +700,10 @@ loop.panel = (function(_, mozL10n) {
userDisplayName: React.PropTypes.string.isRequired
},
mixins: [sharedMixins.DocumentVisibilityMixin],
mixins: [
sharedMixins.DocumentVisibilityMixin,
React.addons.PureRenderMixin
],
getInitialState: function() {
return {
@ -712,6 +715,11 @@ loop.panel = (function(_, mozL10n) {
},
onDocumentVisible: function() {
// We would use onDocumentHidden to null out the data ready for the next
// opening. However, this seems to cause an awkward glitch in the display
// when opening the panel, and it seems cleaner just to update the data
// even if there's a small delay.
this.props.mozLoop.getSelectedTabMetadata(function callback(metadata) {
var previewImage = metadata.favicon || "";
var description = metadata.title || metadata.description;
@ -724,14 +732,6 @@ loop.panel = (function(_, mozL10n) {
}.bind(this));
},
onDocumentHidden: function() {
this.setState({
previewImage: "",
description: "",
url: ""
});
},
onCheckboxChange: function(newState) {
this.setState({checked: newState.checked});
},
@ -1006,8 +1006,8 @@ loop.panel = (function(_, mozL10n) {
document.body.setAttribute("platform", loop.shared.utils.getPlatform());
// Notify the window that we've finished initalization and initial layout
var evtObject = document.createEvent('Event');
evtObject.initEvent('loopPanelInitialized', true, false);
var evtObject = document.createEvent("Event");
evtObject.initEvent("loopPanelInitialized", true, false);
window.dispatchEvent(evtObject);
}
@ -1027,4 +1027,4 @@ loop.panel = (function(_, mozL10n) {
};
})(_, document.mozL10n);
document.addEventListener('DOMContentLoaded', loop.panel.init);
document.addEventListener("DOMContentLoaded", loop.panel.init);

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

@ -128,11 +128,11 @@ loop.panel = (function(_, mozL10n) {
return function(event) {
// Note: side effect!
switch (newAvailabilty) {
case 'available':
case "available":
this.setState({doNotDisturb: false});
navigator.mozLoop.doNotDisturb = false;
break;
case 'do-not-disturb':
case "do-not-disturb":
this.setState({doNotDisturb: true});
navigator.mozLoop.doNotDisturb = true;
break;
@ -145,13 +145,13 @@ loop.panel = (function(_, mozL10n) {
// XXX https://github.com/facebook/react/issues/310 for === htmlFor
var cx = React.addons.classSet;
var availabilityStatus = cx({
'status': true,
'status-dnd': this.state.doNotDisturb,
'status-available': !this.state.doNotDisturb
"status": true,
"status-dnd": this.state.doNotDisturb,
"status-available": !this.state.doNotDisturb
});
var availabilityDropdown = cx({
'dropdown-menu': true,
'hide': !this.state.showMenu
"dropdown-menu": true,
"hide": !this.state.showMenu
});
var availabilityText = this.state.doNotDisturb ?
mozL10n.get("display_name_dnd_status") :
@ -289,7 +289,7 @@ loop.panel = (function(_, mozL10n) {
}
var locale = mozL10n.getLanguage();
navigator.mozLoop.setLoopPref('showPartnerLogo', false);
navigator.mozLoop.setLoopPref("showPartnerLogo", false);
return (
<p id="powered-by" className="powered-by">
{mozL10n.get("powered_by_beforeLogo")}
@ -301,8 +301,8 @@ loop.panel = (function(_, mozL10n) {
render: function() {
if (!this.state.gettingStartedSeen || this.state.seenToS == "unseen") {
var terms_of_use_url = navigator.mozLoop.getLoopPref('legal.ToS_url');
var privacy_notice_url = navigator.mozLoop.getLoopPref('legal.privacy_url');
var terms_of_use_url = navigator.mozLoop.getLoopPref("legal.ToS_url");
var privacy_notice_url = navigator.mozLoop.getLoopPref("legal.privacy_url");
var tosHTML = mozL10n.get("legal_text_and_links3", {
"clientShortname": mozL10n.get("clientShortname2"),
"terms_of_use": React.renderToStaticMarkup(
@ -700,7 +700,10 @@ loop.panel = (function(_, mozL10n) {
userDisplayName: React.PropTypes.string.isRequired
},
mixins: [sharedMixins.DocumentVisibilityMixin],
mixins: [
sharedMixins.DocumentVisibilityMixin,
React.addons.PureRenderMixin
],
getInitialState: function() {
return {
@ -712,6 +715,11 @@ loop.panel = (function(_, mozL10n) {
},
onDocumentVisible: function() {
// We would use onDocumentHidden to null out the data ready for the next
// opening. However, this seems to cause an awkward glitch in the display
// when opening the panel, and it seems cleaner just to update the data
// even if there's a small delay.
this.props.mozLoop.getSelectedTabMetadata(function callback(metadata) {
var previewImage = metadata.favicon || "";
var description = metadata.title || metadata.description;
@ -724,14 +732,6 @@ loop.panel = (function(_, mozL10n) {
}.bind(this));
},
onDocumentHidden: function() {
this.setState({
previewImage: "",
description: "",
url: ""
});
},
onCheckboxChange: function(newState) {
this.setState({checked: newState.checked});
},
@ -1006,8 +1006,8 @@ loop.panel = (function(_, mozL10n) {
document.body.setAttribute("platform", loop.shared.utils.getPlatform());
// Notify the window that we've finished initalization and initial layout
var evtObject = document.createEvent('Event');
evtObject.initEvent('loopPanelInitialized', true, false);
var evtObject = document.createEvent("Event");
evtObject.initEvent("loopPanelInitialized", true, false);
window.dispatchEvent(evtObject);
}
@ -1027,4 +1027,4 @@ loop.panel = (function(_, mozL10n) {
};
})(_, document.mozL10n);
document.addEventListener('DOMContentLoaded', loop.panel.init);
document.addEventListener("DOMContentLoaded", loop.panel.init);

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

@ -665,6 +665,7 @@ loop.roomViews = (function(mozL10n) {
default: {
return (
React.createElement("div", {className: "room-conversation-wrapper"},
React.createElement(sharedViews.TextChatView, {dispatcher: this.props.dispatcher}),
React.createElement(DesktopRoomInvitationView, {
dispatcher: this.props.dispatcher,
error: this.state.error,

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

@ -665,6 +665,7 @@ loop.roomViews = (function(mozL10n) {
default: {
return (
<div className="room-conversation-wrapper">
<sharedViews.TextChatView dispatcher={this.props.dispatcher} />
<DesktopRoomInvitationView
dispatcher={this.props.dispatcher}
error={this.state.error}

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

@ -690,6 +690,27 @@ html, .fx-embedded, #main,
height: 100%;
}
/**
* The .fx-embbeded .text-chat-* styles are very temporarily whilst we work on
* text chat (bug 1108892 and dependencies).
*/
.fx-embedded .text-chat-view {
height: 60px;
color: white;
background-color: black;
}
.fx-embedded .text-chat-entries {
/* XXX Should use flex, this is just for the initial implementation. */
height: calc(100% - 2em);
width: 100%;
}
.fx-embedded .text-chat-box {
width: 100%;
margin: auto;
}
@media screen and (min-width:640px) {
.standalone .conversation-toolbar {
position: absolute;
@ -1268,6 +1289,27 @@ body[dir=rtl] .room-context-btn-edit {
height: auto;
}
.text-chat-entries {
margin: auto;
overflow: scroll;
border: 1px solid red;
}
.text-chat-entry {
text-align: left;
}
.text-chat-entry.received {
text-align: right;
}
.text-chat-box {
margin: auto;
}
.text-chat-box > form > input {
width: 100%;
}
@media screen and (max-width:640px) {
.standalone-room-info {

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

@ -1,3 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="129 5 252 253" width="21pc" height="253pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2014-08-13 17:00Z</dc:date><!-- Produced by OmniGraffle Professional 5.4.4 --></metadata><defs><linearGradient x1="0" x2="1" id="Gradient" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#4ba6e9"/><stop offset="1" stop-color="#4ba7bf"/></linearGradient></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><rect x="129" y="5" width="252" height="252" fill="#4BA6E7"/><circle cx="255" cy="106" r="54.000088" fill="#badbeb"/><path d="M 159.01782 257 L 350.98218 257 C 351.46667 236.66908 342.1 216.2136 322.88218 200.69928 C 285.39187 170.43352 224.60813 170.43352 187.11782 200.69928 C 167.9 216.2136 158.53333 236.66909 159.01782 257 Z" fill="#badbeb"/></g></g></svg>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="129 5 252 253" width="21pc" height="253pt">
<rect x="129" y="5" width="252" height="252" fill="#4ba6e7"/>
<circle cx="255" cy="106" r="54" fill="#badbeb"/>
<path fill="#badbeb" d="M 159.01782 257 L 350.98218 257 C 351.46667 236.66908 342.1 216.2136 322.88218 200.69928 C 285.39187 170.43352 224.60813 170.43352 187.11782 200.69928 C 167.9 216.2136 158.53333 236.66909 159.01782 257 Z"/>
</svg>

До

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

После

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

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

@ -2,25 +2,15 @@
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 100 100"
xmlns:xlink="http://www.w3.org/1999/xlink"
enable-background="new 0 0 100 100">
<style>
</style>
<defs>
<g id="beta-ribbon">
<path fill="#e6e6e6" d="M0,100 100,0 49.1,0 0,49.2z"/>
<path fill="#fff" d="M0,94.7 94.7,0 46.5,0 0,46.6z"/>
<g fill="#999">
<path d="m25.9,56.7l-4,4-13.7-13.7 3.7-3.7c2.4-2.4 5.7-4.1 8.3-1.4 1.7,1.7 1.4,3.9 .5,5.3l.1,.1c1.6-1.1 4-1.9 6.3,.3 3,3 1.3,6.5-1.2,9.1zm-12.2-12.2l-2.2,2.2 4.3,4.3 2.3-2.3c1.6-1.6 1.8-3.1 .2-4.7-1.4-1.6-2.9-1.2-4.6,.5zm6.1,5.4l-2.5,2.5 4.9,4.9 2.4-2.4c1.3-1.3 2.5-3.3 .6-5.3-2-2-3.9-1.2-5.4,.3z"/>
<path d="m30.7,42.7c2.5,2.2 4.6,2.1 6.2,.5 1-1 1.5-2 1.6-3.6l2,.4c-.2,1.7-.9,3.4-2.2,4.7-3.1,3.1-6.9,2.5-10.2-.7-3.2-3.2-3.8-7.1-1.1-9.9 2.7-2.7 6.2-2.3 9.4,.9 .4,.4 .7,.7 .9,1l-6.6,6.7zm-1.4-1.4l4.9-4.9c-2.2-2.1-4.1-2.5-5.7-.9-1.4,1.5-1.3,3.4 .8,5.8z"/>
<path d="m49.8,31.8c-.2,1.1-.8,2.2-1.6,3.1-1.9,1.9-4,1.6-5.9-.2l-6.3-6.3-1.6,1.6-1.4-1.4 1.7-1.7-2.4-2.4 1.6-2 2.6,2.6 2.6-2.6 1.2,1.6-2.4,2.4 6.3,6.3c1.1,1.1 1.9,1.2 2.8,.3 .5-.5 .7-1 .9-1.8l1.9,.5z"/>
<path d="m57,20.8c.8,.8 1.4,.9 2.1,.6l.8,1.7c-1.1,.8-2.1,1.1-3.4,.5 .3,1.7-.4,3.3-1.6,4.6-2.1,2.1-4.7,2.1-6.6,.2-2.2-2.2-1.6-5.1 1.5-8.3l1.4-1.3-.8-.8c-1.5-1.5-2.8-1.3-4.3,.2-.7,.7-1.5,1.8-2.2,3.3l-1.8-.9c.8-1.8 1.8-3.1 2.8-4.2 2.7-2.7 5.1-2.5 7.2-.4l4.9,4.8zm-2,1.6l-2.6-2.6-1.3,1.3c-2.2,2.2-2.2,3.8-.9,5.1 1.3,1.3 2.5,1.4 3.8,.1 1.1-1.1 1.3-2.4 1-3.9z"/>
<path d="M93.4,0 0,94.1 0,96 95.2,0z"/>
<path d="M45.3,0 0,46 0,47.9 47,0z"/>
</g>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<path fill="#e6e6e6" d="M0,100 100,0 49.1,0 0,49.2z"/>
<path fill="#fff" d="M0,94.7 94.7,0 46.5,0 0,46.6z"/>
<g fill="#999">
<path d="m25.9,56.7l-4,4-13.7-13.7 3.7-3.7c2.4-2.4 5.7-4.1 8.3-1.4 1.7,1.7 1.4,3.9 .5,5.3l.1,.1c1.6-1.1 4-1.9 6.3,.3 3,3 1.3,6.5-1.2,9.1zm-12.2-12.2l-2.2,2.2 4.3,4.3 2.3-2.3c1.6-1.6 1.8-3.1 .2-4.7-1.4-1.6-2.9-1.2-4.6,.5zm6.1,5.4l-2.5,2.5 4.9,4.9 2.4-2.4c1.3-1.3 2.5-3.3 .6-5.3-2-2-3.9-1.2-5.4,.3z"/>
<path d="m30.7,42.7c2.5,2.2 4.6,2.1 6.2,.5 1-1 1.5-2 1.6-3.6l2,.4c-.2,1.7-.9,3.4-2.2,4.7-3.1,3.1-6.9,2.5-10.2-.7-3.2-3.2-3.8-7.1-1.1-9.9 2.7-2.7 6.2-2.3 9.4,.9 .4,.4 .7,.7 .9,1l-6.6,6.7zm-1.4-1.4l4.9-4.9c-2.2-2.1-4.1-2.5-5.7-.9-1.4,1.5-1.3,3.4 .8,5.8z"/>
<path d="m49.8,31.8c-.2,1.1-.8,2.2-1.6,3.1-1.9,1.9-4,1.6-5.9-.2l-6.3-6.3-1.6,1.6-1.4-1.4 1.7-1.7-2.4-2.4 1.6-2 2.6,2.6 2.6-2.6 1.2,1.6-2.4,2.4 6.3,6.3c1.1,1.1 1.9,1.2 2.8,.3 .5-.5 .7-1 .9-1.8l1.9,.5z"/>
<path d="m57,20.8c.8,.8 1.4,.9 2.1,.6l.8,1.7c-1.1,.8-2.1,1.1-3.4,.5 .3,1.7-.4,3.3-1.6,4.6-2.1,2.1-4.7,2.1-6.6,.2-2.2-2.2-1.6-5.1 1.5-8.3l1.4-1.3-.8-.8c-1.5-1.5-2.8-1.3-4.3,.2-.7,.7-1.5,1.8-2.2,3.3l-1.8-.9c.8-1.8 1.8-3.1 2.8-4.2 2.7-2.7 5.1-2.5 7.2-.4l4.9,4.8zm-2,1.6l-2.6-2.6-1.3,1.3c-2.2,2.2-2.2,3.8-.9,5.1 1.3,1.3 2.5,1.4 3.8,.1 1.1-1.1 1.3-2.4 1-3.9z"/>
<path d="M93.4,0 0,94.1 0,96 95.2,0z"/>
<path d="M45.3,0 0,46 0,47.9 47,0z"/>
</g>
</defs>
<use id="beta-ribbon" xlink:href="#beta-ribbon"/>
</svg>

До

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

После

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

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

@ -2,11 +2,7 @@
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
x="0" y="0"
width="21" height="21"
viewBox="0 0 21 21">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21" height="21" viewBox="0 0 21 21">
<style>
use:not(:target) {
display: none;
@ -30,11 +26,11 @@
fill: #0096dd;
}
</style>
<defs style="display: none;">
<defs>
<path id="check-shape" d="M 9.39,16.5 16.28,6 14.77,4.5 9.37,12.7 6.28,9.2 4.7,10.7 z"/>
</defs>
<use id="check" xlink:href="#check-shape"/>
<use id="check-active" xlink:href="#check-shape"/>
<use id="check" xlink:href="#check-shape"/>
<use id="check-active" xlink:href="#check-shape"/>
<use id="check-disabled" xlink:href="#check-shape"/>
<use id="check-blue" xlink:href="#check-shape"/>
<use id="check-blue" xlink:href="#check-shape"/>
</svg>

До

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

После

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

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

@ -2,64 +2,48 @@
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
x="0px" y="0px"
viewBox="0 0 10 10"
enable-background="new 0 0 10 10"
xml:space="preserve">
<style>
use:not(:target) {
display: none;
}
use {
fill: #ccc;
}
use[id$="-hover"] {
fill: #444;
}
use[id$="-active"] {
fill: #0095dd;
}
use[id$="-white"] {
fill: rgba(255,255,255,0.8);
}
use[id$="-disabled"] {
fill: rgba(255,255,255,0.4);
}
</style>
<defs style="display:none">
<polygon id="close-shape" fill-rule="evenodd" clip-rule="evenodd" points="10,1.717 8.336,0.049 5.024,3.369 1.663,0 0,1.668
3.36,5.037 0.098,8.307 1.762,9.975 5.025,6.705 8.311,10 9.975,8.332 6.688,5.037"/>
<path id="dropdown-shape" fill-rule="evenodd" clip-rule="evenodd" d="M9,3L4.984,7L1,3H9z"/>
<polygon id="expand-shape" fill-rule="evenodd" clip-rule="evenodd" points="10,0 4.838,0 6.506,1.669 0,8.175 1.825,10 8.331,3.494
10,5.162"/>
<path id="edit-shape" d="M5.493,1.762l2.745,2.745L2.745,10H0V7.255L5.493,1.762z M2.397,9.155l0.601-0.601L1.446,7.002L0.845,7.603
V8.31H1.69v0.845H2.397z M5.849,3.028c0-0.096-0.048-0.144-0.146-0.144c-0.044,0-0.081,0.015-0.112,0.046L2.014,6.508
C1.983,6.538,1.968,6.577,1.968,6.619c0,0.098,0.048,0.146,0.144,0.146c0.044,0,0.081-0.015,0.112-0.046l3.579-3.577
C5.834,3.111,5.849,3.073,5.849,3.028z M10,2.395c0,0.233-0.081,0.431-0.245,0.595L8.66,4.085L5.915,1.34L7.01,0.25
C7.168,0.083,7.366,0,7.605,0c0.233,0,0.433,0.083,0.601,0.25l1.55,1.544C9.919,1.966,10,2.166,10,2.395z"/>
<rect id="minimize-shape" y="3.6" fill-rule="evenodd" clip-rule="evenodd" width="10" height="2.8"/>
</defs>
<use id="close" xlink:href="#close-shape"/>
<use id="close-active" xlink:href="#close-shape"/>
<use id="close-disabled" xlink:href="#close-shape"/>
<use id="dropdown" xlink:href="#dropdown-shape"/>
<use id="dropdown-white" xlink:href="#dropdown-shape"/>
<use id="dropdown-active" xlink:href="#dropdown-shape"/>
<use id="dropdown-disabled" xlink:href="#dropdown-shape"/>
<use id="edit" xlink:href="#edit-shape"/>
<use id="edit-active" xlink:href="#edit-shape"/>
<use id="edit-disabled" xlink:href="#edit-shape"/>
<use id="expand" xlink:href="#expand-shape"/>
<use id="expand-active" xlink:href="#expand-shape"/>
<use id="expand-disabled" xlink:href="#expand-shape"/>
<use id="minimize" xlink:href="#minimize-shape"/>
<use id="minimize-active" xlink:href="#minimize-shape"/>
<use id="minimize-disabled" xlink:href="#minimize-shape"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 10 10">
<style>
use:not(:target) {
display: none;
}
use {
fill: #ccc;
}
use[id$="-hover"] {
fill: #444;
}
use[id$="-active"] {
fill: #0095dd;
}
use[id$="-white"] {
fill: rgba(255,255,255,0.8);
}
use[id$="-disabled"] {
fill: rgba(255,255,255,0.4);
}
</style>
<defs>
<polygon id="close-shape" points="10,1.717 8.336,0.049 5.024,3.369 1.663,0 0,1.668 3.36,5.037 0.098,8.307 1.762,9.975 5.025,6.705 8.311,10 9.975,8.332 6.688,5.037"/>
<path id="dropdown-shape" fill-rule="evenodd" d="M9,3L4.984,7L1,3H9z"/>
<polygon id="expand-shape" points="10,0 4.838,0 6.506,1.669 0,8.175 1.825,10 8.331,3.494 10,5.162"/>
<path id="edit-shape" d="M5.493,1.762l2.745,2.745L2.745,10H0V7.255L5.493,1.762z M2.397,9.155l0.601-0.601L1.446,7.002L0.845,7.603 V8.31H1.69v0.845H2.397z M5.849,3.028c0-0.096-0.048-0.144-0.146-0.144c-0.044,0-0.081,0.015-0.112,0.046L2.014,6.508 C1.983,6.538,1.968,6.577,1.968,6.619c0,0.098,0.048,0.146,0.144,0.146c0.044,0,0.081-0.015,0.112-0.046l3.579-3.577 C5.834,3.111,5.849,3.073,5.849,3.028z M10,2.395c0,0.233-0.081,0.431-0.245,0.595L8.66,4.085L5.915,1.34L7.01,0.25 C7.168,0.083,7.366,0,7.605,0c0.233,0,0.433,0.083,0.601,0.25l1.55,1.544C9.919,1.966,10,2.166,10,2.395z"/>
<rect id="minimize-shape" y="3.6" width="10" height="2.8"/>
</defs>
<use id="close" xlink:href="#close-shape"/>
<use id="close-active" xlink:href="#close-shape"/>
<use id="close-disabled" xlink:href="#close-shape"/>
<use id="dropdown" xlink:href="#dropdown-shape"/>
<use id="dropdown-white" xlink:href="#dropdown-shape"/>
<use id="dropdown-active" xlink:href="#dropdown-shape"/>
<use id="dropdown-disabled" xlink:href="#dropdown-shape"/>
<use id="edit" xlink:href="#edit-shape"/>
<use id="edit-active" xlink:href="#edit-shape"/>
<use id="edit-disabled" xlink:href="#edit-shape"/>
<use id="expand" xlink:href="#expand-shape"/>
<use id="expand-active" xlink:href="#expand-shape"/>
<use id="expand-disabled" xlink:href="#expand-shape"/>
<use id="minimize" xlink:href="#minimize-shape"/>
<use id="minimize-active" xlink:href="#minimize-shape"/>
<use id="minimize-disabled" xlink:href="#minimize-shape"/>
</svg>

До

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

После

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

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

@ -2,133 +2,71 @@
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
x="0px" y="0px"
viewBox="0 0 14 14"
enable-background="new 0 0 14 14"
xml:space="preserve">
<style>
use:not(:target) {
display: none;
}
use {
fill: #ccc;
}
use[id$="-hover"] {
fill: #444;
}
use[id$="-active"] {
fill: #0095dd;
}
use[id$="-white"] {
fill: #fff;
}
</style>
<defs style="display:none">
<path id="audio-shape" fill-rule="evenodd" clip-rule="evenodd" d="M9.571,6.143v1.714c0,1.42-1.151,2.571-2.571,2.571
c-1.42,0-2.571-1.151-2.571-2.571V6.143H3.571v1.714c0,1.597,1.093,2.935,2.571,3.316v0.97H5.714c-0.56,0-1.034,0.358-1.211,0.857
h4.993c-0.177-0.499-0.651-0.857-1.211-0.857H7.857v-0.97c1.478-0.381,2.571-1.719,2.571-3.316V6.143H9.571z M7,10
c1.183,0,2.143-0.959,2.143-2.143V3.143C9.143,1.959,8.183,1,7,1C5.817,1,4.857,1.959,4.857,3.143v4.714C4.857,9.041,5.817,10,7,10
z"/>
<g id="facemute-shape">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.174,3.551L9.568,5.856V5.847L3.39,11.49h5.066
c0.613,0,1.111-0.533,1.111-1.19V8.526l2.606,2.304C12.4,11.071,12.71,11.142,13,11.078V3.302C12.71,3.239,12.4,3.309,12.174,3.551
z"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.395,2.617l-0.001-0.001l-0.809-0.884l-2.102,1.92
C9.316,3.221,8.919,2.918,8.457,2.918H2.111C1.498,2.918,1,3.451,1,4.109v6.191c0,0.318,0.118,0.607,0.306,0.821l-0.288,0.263
l0.809,0.884l0.001,0.001l0.853-0.779l6.887-6.29L12.395,2.617z"/>
</g>
<path id="hangup-shape" fill-rule="evenodd" clip-rule="evenodd" d="M13,11.732c-0.602,0.52-1.254,0.946-1.941,1.267
c-1.825-0.337-4.164-1.695-6.264-3.795C2.696,7.106,1.339,4.769,1,2.945c0.321-0.688,0.748-1.341,1.268-1.944l2.528,2.855
C4.579,4.153,4.377,4.454,4.209,4.759L4.22,4.77C3.924,5.42,4.608,6.833,5.889,8.114c1.281,1.28,2.694,1.965,3.343,1.669
l0.011,0.011c0.305-0.168,0.606-0.37,0.904-0.587L13,11.732z"/>
<path id="incoming-shape" fill-rule="evenodd" clip-rule="evenodd" d="M2.745,7.558l0.637,0.669c0.04,0.041,0.085,0.073,0.134,0.1
l3.249,3.313c0.38,0.393,0.915,0.478,1.197,0.186l0.638-0.676c0.281-0.292,0.2-0.848-0.18-1.244L7.097,8.558h3.566
c0.419,0,0.759-0.34,0.759-0.759V6.28c0-0.419-0.34-0.759-0.759-0.759H7.059l1.42-1.443c0.381-0.392,0.461-0.945,0.18-1.234
l-0.637-0.67C7.74,1.883,7.204,1.966,6.824,2.359L3.55,5.688C3.487,5.717,3.43,5.755,3.381,5.806L2.745,6.482
c-0.131,0.137-0.183,0.332-0.162,0.54C2.562,7.229,2.613,7.423,2.745,7.558z"/>
<path id="link-shape" fill-rule="evenodd" clip-rule="evenodd" d="M7.359,6.107c0.757-0.757,0.757-1.995,0-2.752
L5.573,1.568c-0.757-0.757-1.995-0.757-2.752,0L1.568,2.82c-0.757,0.757-0.757,1.995,0,2.752l1.787,1.787
c0.757,0.757,1.995,0.757,2.752,0L6.266,7.2L6.8,7.734L6.641,7.893c-0.757,0.757-0.757,1.995,0,2.752l1.787,1.787
c0.757,0.757,1.995,0.757,2.752,0l1.253-1.253c0.757-0.757,0.757-1.995,0-2.752l-1.787-1.787c-0.757-0.757-1.995-0.757-2.752,0
L7.734,6.8L7.2,6.266L7.359,6.107z M9.87,7.868l1.335,1.335c0.294,0.294,0.294,0.774,0,1.068l-0.934,0.934
c-0.294,0.294-0.774,0.294-1.068,0L7.868,9.87c-0.294-0.294-0.294-0.774,0-1.068L8.13,9.064c0.294,0.294,0.744,0.324,1.001,0.067
C9.388,8.874,9.358,8.424,9.064,8.13L8.802,7.868C9.096,7.574,9.577,7.574,9.87,7.868z M4.13,6.132L2.795,4.797
c-0.294-0.294-0.294-0.774,0-1.068l0.934-0.934c0.294-0.294,0.774-0.294,1.068,0L6.132,4.13c0.294,0.294,0.294,0.774,0,1.068
L5.86,4.926C5.567,4.632,5.116,4.602,4.859,4.859C4.602,5.116,4.632,5.567,4.926,5.86l0.272,0.272
C4.904,6.426,4.423,6.426,4.13,6.132z"/>
<g id="mute-shape">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.186,9.492L5.49,9.188l3.822-3.822l2.354-2.354l-0.848-0.848
L9.312,3.669V3.142C9.312,1.959,8.352,1,7.169,1C5.986,1,5.026,1.959,5.026,3.142v4.715c0,0.032,0.001,0.064,0.002,0.096
L4.643,8.338c-0.03-0.156-0.046-0.317-0.046-0.481V6.142H3.741v1.715c0,0.414,0.073,0.81,0.208,1.176l-1.615,1.615l0.848,0.848
l1.398-1.398v0L5.186,9.492z"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.312,7.857V6.045L5.829,9.528C6.196,9.824,6.662,10,7.169,10
C8.352,10,9.312,9.04,9.312,7.857z"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.741,7.857c0,1.42-1.151,2.572-2.572,2.572
c-0.625,0-1.199-0.223-1.645-0.595l-0.605,0.605c0.395,0.344,0.87,0.599,1.393,0.734v0.97H5.884c-0.56,0-1.034,0.359-1.212,0.858
h4.994c-0.178-0.499-0.652-0.858-1.212-0.858H8.026v-0.97c1.478-0.38,2.572-1.718,2.572-3.316V6.142H9.741V7.857z"/>
</g>
<path id="pause-shape" fill-rule="evenodd" clip-rule="evenodd" d="M4.75,1h-1.5C2.836,1,2.5,1.336,2.5,1.75v10.5
C2.5,12.664,2.836,13,3.25,13h1.5c0.414,0,0.75-0.336,0.75-0.75V1.75C5.5,1.336,5.164,1,4.75,1z M10.75,1h-1.5
C8.836,1,8.5,1.336,8.5,1.75v10.5C8.5,12.664,8.836,13,9.25,13h1.5c0.414,0,0.75-0.336,0.75-0.75V1.75C11.5,1.336,11.164,1,10.75,1
z"/>
<path id="video-shape" fill-rule="evenodd" clip-rule="evenodd" d="M12.175,3.347L9.568,5.651V3.905c0-0.657-0.497-1.19-1.111-1.19
H2.111C1.498,2.714,1,3.247,1,3.905v6.191c0,0.658,0.498,1.19,1.111,1.19h6.345c0.614,0,1.111-0.533,1.111-1.19V8.322l2.607,2.305
C12.4,10.867,12.71,10.938,13,10.874V3.099C12.71,3.035,12.4,3.106,12.175,3.347z"/>
<g id="volume-shape">
<path fill-rule="evenodd" clip-rule="evenodd" d="M3.513,4.404H1.896c-0.417,0-0.756,0.338-0.756,0.755v3.679
c0,0.417,0.338,0.755,0.756,0.755H3.51l2.575,2.575c0.261,0.261,0.596,0.4,0.938,0.422V1.409C6.682,1.431,6.346,1.57,6.085,1.831
L3.513,4.404z M8.555,5.995C8.619,6.32,8.653,6.656,8.653,7c0,0.344-0.034,0.679-0.098,1.004l0.218,0.142
C8.852,7.777,8.895,7.393,8.895,7c0-0.394-0.043-0.777-0.123-1.147L8.555,5.995z M12.224,3.6l-0.475,0.31
c0.359,0.962,0.557,2.003,0.557,3.09c0,1.087-0.198,2.128-0.557,3.09l0.475,0.31c0.41-1.054,0.635-2.201,0.635-3.4
C12.859,5.8,12.634,4.654,12.224,3.6z M10.061,5.012C10.25,5.642,10.353,6.308,10.353,7c0,0.691-0.103,1.358-0.293,1.987
l0.351,0.229C10.634,8.517,10.756,7.772,10.756,7c0-0.773-0.121-1.517-0.345-2.216L10.061,5.012z"/>
<path d="M7.164,12.74l-0.15-0.009c-0.389-0.024-0.754-0.189-1.028-0.463L3.452,9.735H1.896
C1.402,9.735,1,9.333,1,8.838V5.16c0-0.494,0.402-0.896,0.896-0.896h1.558l2.531-2.531C6.26,1.458,6.625,1.293,7.014,1.269
l0.15-0.009V12.74z M1.896,4.545c-0.339,0-0.615,0.276-0.615,0.615v3.679c0,0.339,0.276,0.615,0.615,0.615h1.672l2.616,2.616
c0.19,0.19,0.434,0.316,0.697,0.363V1.568C6.619,1.615,6.375,1.741,6.185,1.931L3.571,4.545H1.896z M12.292,10.612l-0.714-0.467
l0.039-0.105C11.981,9.067,12.165,8.044,12.165,7c0-1.044-0.184-2.067-0.548-3.041l-0.039-0.105l0.714-0.467l0.063,0.162
C12.783,4.649,13,5.81,13,7s-0.217,2.351-0.645,3.451L12.292,10.612z M11.92,10.033l0.234,0.153
c0.374-1.019,0.564-2.09,0.564-3.186s-0.19-2.167-0.564-3.186L11.92,3.966C12.27,4.94,12.447,5.96,12.447,7
C12.447,8.04,12.27,9.059,11.92,10.033z M10.489,9.435L9.895,9.047l0.031-0.101C10.116,8.315,10.212,7.66,10.212,7
c0-0.661-0.096-1.316-0.287-1.947L9.895,4.952l0.594-0.388l0.056,0.176C10.779,5.471,10.897,6.231,10.897,7
c0,0.769-0.118,1.529-0.351,2.259L10.489,9.435z M10.225,8.926l0.106,0.069C10.52,8.348,10.615,7.677,10.615,7
c0-0.677-0.095-1.348-0.284-1.996l-0.106,0.07C10.403,5.699,10.494,6.347,10.494,7C10.494,7.652,10.403,8.3,10.225,8.926z
M8.867,8.376L8.398,8.07l0.018-0.093C8.48,7.654,8.512,7.325,8.512,7S8.48,6.345,8.417,6.022L8.398,5.929l0.469-0.306l0.043,0.2
C8.994,6.211,9.036,6.607,9.036,7c0,0.393-0.042,0.789-0.126,1.176L8.867,8.376z"/>
</g>
</defs>
<use id="audio" xlink:href="#audio-shape"/>
<use id="audio-active" xlink:href="#audio-shape"/>
<use id="audio-disabled" xlink:href="#audio-shape"/>
<use id="facemute" xlink:href="#facemute-shape"/>
<use id="facemute-active" xlink:href="#facemute-shape"/>
<use id="facemute-disabled" xlink:href="#facemute-shape"/>
<use id="hangup" xlink:href="#hangup-shape"/>
<use id="hangup-active" xlink:href="#hangup-shape"/>
<use id="hangup-disabled" xlink:href="#hangup-shape"/>
<use id="incoming" xlink:href="#incoming-shape"/>
<use id="incoming-active" xlink:href="#incoming-shape"/>
<use id="incoming-disabled" xlink:href="#incoming-shape"/>
<use id="link" xlink:href="#link-shape"/>
<use id="link-active" xlink:href="#link-shape"/>
<use id="link-disabled" xlink:href="#link-shape"/>
<use id="mute" xlink:href="#mute-shape"/>
<use id="mute-active" xlink:href="#mute-shape"/>
<use id="mute-disabled" xlink:href="#mute-shape"/>
<use id="pause" xlink:href="#pause-shape"/>
<use id="pause-active" xlink:href="#pause-shape"/>
<use id="pause-disabled" xlink:href="#pause-shape"/>
<use id="video" xlink:href="#video-shape"/>
<use id="video-white" xlink:href="#video-shape"/>
<use id="video-active" xlink:href="#video-shape"/>
<use id="video-disabled" xlink:href="#video-shape"/>
<use id="volume" xlink:href="#volume-shape"/>
<use id="volume-active" xlink:href="#volume-shape"/>
<use id="volume-disabled" xlink:href="#volume-shape"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 14 14">
<style>
use:not(:target) {
display: none;
}
use {
fill: #ccc;
}
use[id$="-hover"] {
fill: #444;
}
use[id$="-active"] {
fill: #0095dd;
}
use[id$="-white"] {
fill: #fff;
}
</style>
<defs>
<path id="audio-shape" fill-rule="evenodd" d="M9.571,6.143v1.714c0,1.42-1.151,2.571-2.571,2.571 c-1.42,0-2.571-1.151-2.571-2.571V6.143H3.571v1.714c0,1.597,1.093,2.935,2.571,3.316v0.97H5.714c-0.56,0-1.034,0.358-1.211,0.857 h4.993c-0.177-0.499-0.651-0.857-1.211-0.857H7.857v-0.97c1.478-0.381,2.571-1.719,2.571-3.316V6.143H9.571z M7,10 c1.183,0,2.143-0.959,2.143-2.143V3.143C9.143,1.959,8.183,1,7,1C5.817,1,4.857,1.959,4.857,3.143v4.714C4.857,9.041,5.817,10,7,10 z"/>
<g id="facemute-shape">
<path fill-rule="evenodd" d="M12.174,3.551L9.568,5.856V5.847L3.39,11.49h5.066 c0.613,0,1.111-0.533,1.111-1.19V8.526l2.606,2.304C12.4,11.071,12.71,11.142,13,11.078V3.302C12.71,3.239,12.4,3.309,12.174,3.551 z"/>
<path fill-rule="evenodd" d="M12.395,2.617l-0.001-0.001l-0.809-0.884l-2.102,1.92 C9.316,3.221,8.919,2.918,8.457,2.918H2.111C1.498,2.918,1,3.451,1,4.109v6.191c0,0.318,0.118,0.607,0.306,0.821l-0.288,0.263 l0.809,0.884l0.001,0.001l0.853-0.779l6.887-6.29L12.395,2.617z"/>
</g>
<path id="hangup-shape" fill-rule="evenodd" d="M13,11.732c-0.602,0.52-1.254,0.946-1.941,1.267 c-1.825-0.337-4.164-1.695-6.264-3.795C2.696,7.106,1.339,4.769,1,2.945c0.321-0.688,0.748-1.341,1.268-1.944l2.528,2.855 C4.579,4.153,4.377,4.454,4.209,4.759L4.22,4.77C3.924,5.42,4.608,6.833,5.889,8.114c1.281,1.28,2.694,1.965,3.343,1.669 l0.011,0.011c0.305-0.168,0.606-0.37,0.904-0.587L13,11.732z"/>
<path id="incoming-shape" fill-rule="evenodd" d="M2.745,7.558l0.637,0.669c0.04,0.041,0.085,0.073,0.134,0.1 l3.249,3.313c0.38,0.393,0.915,0.478,1.197,0.186l0.638-0.676c0.281-0.292,0.2-0.848-0.18-1.244L7.097,8.558h3.566 c0.419,0,0.759-0.34,0.759-0.759V6.28c0-0.419-0.34-0.759-0.759-0.759H7.059l1.42-1.443c0.381-0.392,0.461-0.945,0.18-1.234 l-0.637-0.67C7.74,1.883,7.204,1.966,6.824,2.359L3.55,5.688C3.487,5.717,3.43,5.755,3.381,5.806L2.745,6.482 c-0.131,0.137-0.183,0.332-0.162,0.54C2.562,7.229,2.613,7.423,2.745,7.558z"/>
<path id="link-shape" fill-rule="evenodd" d="M7.359,6.107c0.757-0.757,0.757-1.995,0-2.752 L5.573,1.568c-0.757-0.757-1.995-0.757-2.752,0L1.568,2.82c-0.757,0.757-0.757,1.995,0,2.752l1.787,1.787 c0.757,0.757,1.995,0.757,2.752,0L6.266,7.2L6.8,7.734L6.641,7.893c-0.757,0.757-0.757,1.995,0,2.752l1.787,1.787 c0.757,0.757,1.995,0.757,2.752,0l1.253-1.253c0.757-0.757,0.757-1.995,0-2.752l-1.787-1.787c-0.757-0.757-1.995-0.757-2.752,0 L7.734,6.8L7.2,6.266L7.359,6.107z M9.87,7.868l1.335,1.335c0.294,0.294,0.294,0.774,0,1.068l-0.934,0.934 c-0.294,0.294-0.774,0.294-1.068,0L7.868,9.87c-0.294-0.294-0.294-0.774,0-1.068L8.13,9.064c0.294,0.294,0.744,0.324,1.001,0.067 C9.388,8.874,9.358,8.424,9.064,8.13L8.802,7.868C9.096,7.574,9.577,7.574,9.87,7.868z M4.13,6.132L2.795,4.797 c-0.294-0.294-0.294-0.774,0-1.068l0.934-0.934c0.294-0.294,0.774-0.294,1.068,0L6.132,4.13c0.294,0.294,0.294,0.774,0,1.068 L5.86,4.926C5.567,4.632,5.116,4.602,4.859,4.859C4.602,5.116,4.632,5.567,4.926,5.86l0.272,0.272 C4.904,6.426,4.423,6.426,4.13,6.132z"/>
<g id="mute-shape">
<path fill-rule="evenodd" d="M5.186,9.492L5.49,9.188l3.822-3.822l2.354-2.354l-0.848-0.848 L9.312,3.669V3.142C9.312,1.959,8.352,1,7.169,1C5.986,1,5.026,1.959,5.026,3.142v4.715c0,0.032,0.001,0.064,0.002,0.096 L4.643,8.338c-0.03-0.156-0.046-0.317-0.046-0.481V6.142H3.741v1.715c0,0.414,0.073,0.81,0.208,1.176l-1.615,1.615l0.848,0.848 l1.398-1.398v0L5.186,9.492z"/>
<path fill-rule="evenodd" d="M9.312,7.857V6.045L5.829,9.528C6.196,9.824,6.662,10,7.169,10 C8.352,10,9.312,9.04,9.312,7.857z"/>
<path fill-rule="evenodd" d="M9.741,7.857c0,1.42-1.151,2.572-2.572,2.572 c-0.625,0-1.199-0.223-1.645-0.595l-0.605,0.605c0.395,0.344,0.87,0.599,1.393,0.734v0.97H5.884c-0.56,0-1.034,0.359-1.212,0.858 h4.994c-0.178-0.499-0.652-0.858-1.212-0.858H8.026v-0.97c1.478-0.38,2.572-1.718,2.572-3.316V6.142H9.741V7.857z"/>
</g>
<path id="pause-shape" fill-rule="evenodd" d="M4.75,1h-1.5C2.836,1,2.5,1.336,2.5,1.75v10.5 C2.5,12.664,2.836,13,3.25,13h1.5c0.414,0,0.75-0.336,0.75-0.75V1.75C5.5,1.336,5.164,1,4.75,1z M10.75,1h-1.5 C8.836,1,8.5,1.336,8.5,1.75v10.5C8.5,12.664,8.836,13,9.25,13h1.5c0.414,0,0.75-0.336,0.75-0.75V1.75C11.5,1.336,11.164,1,10.75,1 z"/>
<path id="video-shape" fill-rule="evenodd" d="M12.175,3.347L9.568,5.651V3.905c0-0.657-0.497-1.19-1.111-1.19 H2.111C1.498,2.714,1,3.247,1,3.905v6.191c0,0.658,0.498,1.19,1.111,1.19h6.345c0.614,0,1.111-0.533,1.111-1.19V8.322l2.607,2.305 C12.4,10.867,12.71,10.938,13,10.874V3.099C12.71,3.035,12.4,3.106,12.175,3.347z"/>
<g id="volume-shape">
<path fill-rule="evenodd" d="M3.513,4.404H1.896c-0.417,0-0.756,0.338-0.756,0.755v3.679 c0,0.417,0.338,0.755,0.756,0.755H3.51l2.575,2.575c0.261,0.261,0.596,0.4,0.938,0.422V1.409C6.682,1.431,6.346,1.57,6.085,1.831 L3.513,4.404z M8.555,5.995C8.619,6.32,8.653,6.656,8.653,7c0,0.344-0.034,0.679-0.098,1.004l0.218,0.142 C8.852,7.777,8.895,7.393,8.895,7c0-0.394-0.043-0.777-0.123-1.147L8.555,5.995z M12.224,3.6l-0.475,0.31 c0.359,0.962,0.557,2.003,0.557,3.09c0,1.087-0.198,2.128-0.557,3.09l0.475,0.31c0.41-1.054,0.635-2.201,0.635-3.4 C12.859,5.8,12.634,4.654,12.224,3.6z M10.061,5.012C10.25,5.642,10.353,6.308,10.353,7c0,0.691-0.103,1.358-0.293,1.987 l0.351,0.229C10.634,8.517,10.756,7.772,10.756,7c0-0.773-0.121-1.517-0.345-2.216L10.061,5.012z"/>
<path d="M7.164,12.74l-0.15-0.009c-0.389-0.024-0.754-0.189-1.028-0.463L3.452,9.735H1.896 C1.402,9.735,1,9.333,1,8.838V5.16c0-0.494,0.402-0.896,0.896-0.896h1.558l2.531-2.531C6.26,1.458,6.625,1.293,7.014,1.269 l0.15-0.009V12.74z M1.896,4.545c-0.339,0-0.615,0.276-0.615,0.615v3.679c0,0.339,0.276,0.615,0.615,0.615h1.672l2.616,2.616 c0.19,0.19,0.434,0.316,0.697,0.363V1.568C6.619,1.615,6.375,1.741,6.185,1.931L3.571,4.545H1.896z M12.292,10.612l-0.714-0.467 l0.039-0.105C11.981,9.067,12.165,8.044,12.165,7c0-1.044-0.184-2.067-0.548-3.041l-0.039-0.105l0.714-0.467l0.063,0.162 C12.783,4.649,13,5.81,13,7s-0.217,2.351-0.645,3.451L12.292,10.612z M11.92,10.033l0.234,0.153 c0.374-1.019,0.564-2.09,0.564-3.186s-0.19-2.167-0.564-3.186L11.92,3.966C12.27,4.94,12.447,5.96,12.447,7 C12.447,8.04,12.27,9.059,11.92,10.033z M10.489,9.435L9.895,9.047l0.031-0.101C10.116,8.315,10.212,7.66,10.212,7 c0-0.661-0.096-1.316-0.287-1.947L9.895,4.952l0.594-0.388l0.056,0.176C10.779,5.471,10.897,6.231,10.897,7 c0,0.769-0.118,1.529-0.351,2.259L10.489,9.435z M10.225,8.926l0.106,0.069C10.52,8.348,10.615,7.677,10.615,7 c0-0.677-0.095-1.348-0.284-1.996l-0.106,0.07C10.403,5.699,10.494,6.347,10.494,7C10.494,7.652,10.403,8.3,10.225,8.926z M8.867,8.376L8.398,8.07l0.018-0.093C8.48,7.654,8.512,7.325,8.512,7S8.48,6.345,8.417,6.022L8.398,5.929l0.469-0.306l0.043,0.2 C8.994,6.211,9.036,6.607,9.036,7c0,0.393-0.042,0.789-0.126,1.176L8.867,8.376z"/>
</g>
</defs>
<use id="audio" xlink:href="#audio-shape"/>
<use id="audio-active" xlink:href="#audio-shape"/>
<use id="audio-disabled" xlink:href="#audio-shape"/>
<use id="facemute" xlink:href="#facemute-shape"/>
<use id="facemute-active" xlink:href="#facemute-shape"/>
<use id="facemute-disabled" xlink:href="#facemute-shape"/>
<use id="hangup" xlink:href="#hangup-shape"/>
<use id="hangup-active" xlink:href="#hangup-shape"/>
<use id="hangup-disabled" xlink:href="#hangup-shape"/>
<use id="incoming" xlink:href="#incoming-shape"/>
<use id="incoming-active" xlink:href="#incoming-shape"/>
<use id="incoming-disabled" xlink:href="#incoming-shape"/>
<use id="link" xlink:href="#link-shape"/>
<use id="link-active" xlink:href="#link-shape"/>
<use id="link-disabled" xlink:href="#link-shape"/>
<use id="mute" xlink:href="#mute-shape"/>
<use id="mute-active" xlink:href="#mute-shape"/>
<use id="mute-disabled" xlink:href="#mute-shape"/>
<use id="pause" xlink:href="#pause-shape"/>
<use id="pause-active" xlink:href="#pause-shape"/>
<use id="pause-disabled" xlink:href="#pause-shape"/>
<use id="video" xlink:href="#video-shape"/>
<use id="video-white" xlink:href="#video-shape"/>
<use id="video-active" xlink:href="#video-shape"/>
<use id="video-disabled" xlink:href="#video-shape"/>
<use id="volume" xlink:href="#volume-shape"/>
<use id="volume-active" xlink:href="#volume-shape"/>
<use id="volume-disabled" xlink:href="#volume-shape"/>
</svg>

До

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

После

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

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

@ -2,222 +2,131 @@
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
x="0px" y="0px"
viewBox="0 0 16 16"
enable-background="new 0 0 16 16"
xml:space="preserve">
<style>
use:not(:target) {
display: none;
}
use {
fill: #ccc;
}
use[id$="-hover"] {
fill: #444;
}
use[id$="-active"] {
fill: #0095dd;
}
use[id$="-red"] {
fill: #d74345
}
use[id$="-white"] {
fill: #fff;
}
use[id$="-darkgrey"] {
fill: #666;
}
use[id$="-disabled"] {
fill: rgba(255,255,255,.6);
}
</style>
<defs style="display:none">
<polygon id="add-shape" fill-rule="evenodd" clip-rule="evenodd" points="16,6.4 9.6,6.4 9.6,0 6.4,0 6.4,6.4 0,6.4 0,9.6
6.4,9.6 6.4,16 9.6,16 9.6,9.6 16,9.6"/>
<path id="audio-shape" fill-rule="evenodd" clip-rule="evenodd" d="M11.429,6.857v2.286c0,1.894-1.535,3.429-3.429,3.429
c-1.894,0-3.429-1.535-3.429-3.429V6.857H3.429v2.286c0,2.129,1.458,3.913,3.429,4.422v1.293H6.286
c-0.746,0-1.379,0.477-1.615,1.143h6.658c-0.236-0.665-0.869-1.143-1.615-1.143H9.143v-1.293c1.971-0.508,3.429-2.292,3.429-4.422
V6.857H11.429z M8,12c1.578,0,2.857-1.279,2.857-2.857V2.857C10.857,1.279,9.578,0,8,0C6.422,0,5.143,1.279,5.143,2.857v6.286
C5.143,10.721,6.422,12,8,12z"/>
<path id="block-shape" fill-rule="evenodd" clip-rule="evenodd" d="M8,0C3.582,0,0,3.582,0,8c0,4.418,3.582,8,8,8
c4.418,0,8-3.582,8-8C16,3.582,12.418,0,8,0z M8,2.442c1.073,0,2.075,0.301,2.926,0.821l-7.673,7.673
C2.718,10.085,2.408,9.079,2.408,8C2.408,4.931,4.911,2.442,8,2.442z M8,13.557c-1.073,0-2.075-0.301-2.926-0.821l7.673-7.673
C13.282,5.915,13.592,6.921,13.592,8C13.592,11.069,11.089,13.557,8,13.557z"/>
<path id="contacts-shape" fill-rule="evenodd" clip-rule="evenodd" d="M8,6.526c1.802,0,3.263-1.461,3.263-3.263
C11.263,1.461,9.802,0,8,0C6.198,0,4.737,1.461,4.737,3.263C4.737,5.066,6.198,6.526,8,6.526z M14.067,11.421c0,0,0-0.001,0-0.001
c0-1.676-1.397-3.119-3.419-3.807L8.001,10.26L5.354,7.613C3.331,8.3,1.933,9.744,1.933,11.42v0.001H1.93
c0,1.679,0.328,3.246,0.896,4.579h10.348c0.568-1.333,0.896-2.9,0.896-4.579H14.067z"/>
<g id="google-shape">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.001,9.278c-0.9,0.03-1.989,0.454-2.144,1.274
c-0.292,1.54,1.284,2.004,2.455,1.932c1.097-0.067,1.737-0.593,1.813-1.26c0.063-0.554-0.184-1.153-0.959-1.644
c-0.142-0.09-0.28-0.185-0.413-0.282C8.504,9.291,8.25,9.27,8.001,9.278z"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.381,3.409C6.638,3.64,6.32,4.405,6.627,5.61
C6.908,6.708,7.78,7.322,8.569,7.104c0.77-0.213,0.987-1.021,0.847-1.873C9.201,3.929,8.261,3.136,7.381,3.409z"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8,0C3.582,0,0,3.582,0,8s3.582,8,8,8c4.418,0,8-3.582,8-8
S12.418,0,8,0z M10.544,4.471c0.17,0.453,0.194,0.954,0.021,1.416c-0.163,0.436-0.495,0.811-0.982,1.096
C9.307,7.146,9.167,7.351,9.151,7.548c-0.045,0.575,0.658,0.993,1.064,1.297c0.889,0.666,1.236,1.758,0.648,2.813
c-0.562,1.007-1.901,1.457-3.322,1.462c-1.766-0.008-2.88-0.817-2.938-1.918C4.527,9.779,5.987,9.101,7.307,8.947
c0.369-0.043,0.7-0.036,1.01-0.014C7.85,8.625,7.675,7.998,7.914,7.58c0.062-0.109,0.023-0.072-0.095-0.054
C6.739,7.689,5.628,6.985,5.367,5.92c-0.132-0.54-0.05-1.105,0.156-1.547C5.97,3.413,6.964,2.88,8.067,2.88
c1.147,0,2.209,0,3.334,0.009L10.612,3.4H9.714C10.093,3.665,10.384,4.046,10.544,4.471z"/>
</g>
<path id="history-shape" fill-rule="evenodd" clip-rule="evenodd" d="M8,16c-4.418,0-8-3.582-8-8c0-4.418,3.582-8,8-8
c4.418,0,8,3.582,8,8C16,12.418,12.418,16,8,16z M8,2.442C4.911,2.442,2.408,4.931,2.408,8c0,3.069,2.504,5.557,5.592,5.557
S13.592,11.069,13.592,8C13.592,4.931,11.089,2.442,8,2.442z M7.649,9.048C7.206,8.899,6.882,8.493,6.882,8V4.645
c0-0.618,0.501-1.119,1.118-1.119c0.618,0,1.119,0.501,1.119,1.119v3.078c1.176,1.22,2.237,3.633,2.237,3.633
S8.844,10.252,7.649,9.048z"/>
<path id="precall-shape" fill-rule="evenodd" clip-rule="evenodd" d="M8.014,0.003c-4.411,0-7.987,3.576-7.987,7.986
c0,1.642,0.496,3.168,1.346,4.437L0,15.997l3.568-1.372c1.271,0.853,2.8,1.352,4.446,1.352c4.411,0,7.986-3.576,7.986-7.987
C16,3.579,12.424,0.003,8.014,0.003z"/>
<path id="settings-shape" fill-rule="evenodd" clip-rule="evenodd" d="M14.77,8c0,0.804,0.262,1.548,0.634,1.678L16,9.887
c-0.205,0.874-0.553,1.692-1.011,2.434l-0.567-0.272c-0.355-0.171-1.066,0.17-1.635,0.738c-0.569,0.569-0.909,1.279-0.738,1.635
l0.273,0.568c-0.741,0.46-1.566,0.79-2.438,0.998l-0.205-0.584c-0.13-0.372-0.874-0.634-1.678-0.634s-1.548,0.262-1.678,0.634
l-0.209,0.596c-0.874-0.205-1.692-0.553-2.434-1.011l0.272-0.567c0.171-0.355-0.17-1.066-0.739-1.635
c-0.568-0.568-1.279-0.909-1.635-0.738l-0.568,0.273c-0.46-0.741-0.79-1.566-0.998-2.439l0.584-0.205
C0.969,9.547,1.231,8.804,1.231,8c0-0.804-0.262-1.548-0.634-1.678L0,6.112c0.206-0.874,0.565-1.685,1.025-2.427l0.554,0.266
c0.355,0.171,1.066-0.17,1.635-0.738c0.569-0.568,0.909-1.28,0.739-1.635L3.686,1.025c0.742-0.46,1.553-0.818,2.427-1.024
l0.209,0.596C6.453,0.969,7.197,1.23,8.001,1.23s1.548-0.262,1.678-0.634l0.209-0.596c0.874,0.205,1.692,0.553,2.434,1.011
l-0.272,0.567c-0.171,0.355,0.17,1.066,0.738,1.635c0.569,0.568,1.279,0.909,1.635,0.738l0.568-0.273
c0.46,0.741,0.79,1.566,0.998,2.438l-0.584,0.205C15.032,6.452,14.77,7.196,14.77,8z M8.001,3.661C5.604,3.661,3.661,5.603,3.661,8
c0,2.397,1.943,4.34,4.339,4.34c2.397,0,4.339-1.943,4.339-4.34C12.34,5.603,10.397,3.661,8.001,3.661z"/>
<g id="share-shape">
<path fill="transparent" d="M11.704,12.375H7.556c-0.183,0-0.353-0.071-0.48-0.199c-0.124-0.125-0.191-0.29-0.19-0.464V10.09h-2.59
c-0.37,0-0.671-0.296-0.671-0.661V4.286c0-0.365,0.301-0.661,0.671-0.661h3.384L7.817,3.73l1.299,1.254v0.927h1.851
l1.408,1.359v4.444C12.375,12.079,12.074,12.375,11.704,12.375z M7.635,11.625h3.989V7.588l-0.961-0.927H7.635V11.625z
M4.375,9.34h2.5V6.561c0-0.365,0.301-0.661,0.671-0.661h0.82V5.302L7.405,4.375h-3.03V9.34z"/>
<polygon fill="transparent" points="10.222,8 10.222,6.857 11.407,8"/>
<polygon fill="transparent" points="6.963,5.714 6.963,4.571 8.148,5.714"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.999,10.654L8.69,10.6L8.999,16l2.56-3.754L8.999,10.654z
M8.658,10.041l0.341-0.043l6,2.898V0L1,10.998l4.55-0.569L8.999,16l-1.892-5.68l-0.283-0.05l0.256-0.032L7,9.998l6.999-8.003
L8.656,9.998L8.658,10.041z"/>
</g>
<path id="tag-shape" fill-rule="evenodd" clip-rule="evenodd" d="M15.578,7.317L9.659,1.398
C9.374,1.033,8.955,0.777,8.471,0.761L2.556,0C1.72-0.027-0.027,1.72,0,2.556l0.761,5.916c0.016,0.484,0.272,0.902,0.637,1.188
l5.919,5.919c0.591,0.591,1.584,0.557,2.218-0.076l5.966-5.966C16.135,8.902,16.169,7.909,15.578,7.317z M4.222,4.163
c-0.511,0.511-1.339,0.511-1.85,0c-0.511-0.511-0.511-1.339,0-1.85c0.511-0.511,1.339-0.511,1.85,0
C4.733,2.823,4.733,3.652,4.222,4.163z"/>
<path id="unblock-shape" fill-rule="evenodd" clip-rule="evenodd" d="M8,16c-4.418,0-8-3.582-8-8c0-4.418,3.582-8,8-8
c4.418,0,8,3.582,8,8C16,12.418,12.418,16,8,16z M8,2.442C4.911,2.442,2.408,4.931,2.408,8c0,3.069,2.504,5.557,5.592,5.557
S13.592,11.069,13.592,8C13.592,4.931,11.089,2.442,8,2.442z"/>
<path id="video-shape" fill-rule="evenodd" clip-rule="evenodd" d="M14.9,3.129l-3.476,3.073V3.873c0-0.877-0.663-1.587-1.482-1.587
H1.482C0.663,2.286,0,2.996,0,3.873v8.254c0,0.877,0.663,1.587,1.482,1.587h8.461c0.818,0,1.482-0.711,1.482-1.587V9.762
l3.476,3.073c0.3,0.321,0.714,0.416,1.1,0.331V2.798C15.614,2.713,15.2,2.808,14.9,3.129z"/>
<g id="copy-shape">
<circle fill-rule="evenodd" clip-rule="evenodd" fill="#0096DD" cx="8" cy="8" r="8"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="none"
stroke="#FFFFFF" stroke-width="0.75" stroke-miterlimit="10"
d="M10.815,6.286H7.556c-0.164,0-0.296,0.128-0.296,0.286v5.143C7.259,11.872,7.392,12,7.556,12h4.148
C11.867,12,12,11.872,12,11.714V7.429L10.815,6.286z
M8.741,6.275V5.143L7.556,4H7.528C6.509,4,4.593,4,4.593,4H4.296
C4.133,4,4,4.128,4,4.286v5.143c0,0.158,0.133,0.286,0.296,0.286H7.25V6.561c0-0.158,0.133-0.286,0.296-0.286H8.741z"/>
<polygon fill-rule="evenodd" clip-rule="evenodd"
fill="#FFFFFF" points="10.222,8 10.222,6.857 11.407,8"/>
<polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF"
points="6.963,5.714 6.963,4.571 8.148,5.714"/>
</g>
<g id="checkmark-shape">
<circle fill-rule="evenodd" clip-rule="evenodd" fill="#0096DD" cx="8"
cy="8" r="8"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF"
d="M7.236,12L12,5.007L10.956,4L7.224,9.465l-2.14-2.326L4,8.146L7.236,12z"/>
</g>
<g id="trash-shape">
<circle fill-rule="evenodd" clip-rule="evenodd" fill="#D74345" cx="8" cy="8" r="8"/>
<path fill="#FFFFFF" d="M12,5.79c0-0.742-0.537-1.344-1.2-1.344h-0.583V4.121c0-0.713-0.516-1.29-1.152-1.29h-2.13
c-0.636,0-1.152,0.578-1.152,1.29v0.324H5.2C4.537,4.446,4,5.048,4,5.79v0.898h0.687l0.508,5.438
c0.054,0.585,0.543,1.044,1.114,1.044h3.38c0.57,0,1.06-0.458,1.114-1.043l0.509-5.439H12V5.79z M6.407,4.264V4.165
c0-0.375,0.271-0.678,0.606-0.678h1.974c0.334,0,0.606,0.304,0.606,0.678v0.099c0,0.063-0.01,0.123-0.025,0.181H6.432
C6.417,4.387,6.407,4.328,6.407,4.264z M10.057,12.056c-0.019,0.197-0.188,0.363-0.368,0.363h-3.38
c-0.182,0-0.35-0.166-0.368-0.363L5.44,6.687h5.12L10.057,12.056z"/>
<rect x="7.75" y="7.542" fill="#FFFFFF" width="0.5" height="4"/>
<polyline fill="#FFFFFF" points="9.25,7.542 8.75,7.542 8.75,11.542 9.25,11.542 "/>
<rect x="6.75" y="7.542" fill="#FFFFFF" width="0.5" height="4"/>
</g>
<g id="leave-shape">
<polygon fill="#FFFFFF" points="2.08,11.52 2.08,4 8,4 8,2.24 0.32,2.24 0.32,13.28 8,13.28 8,11.52"/>
<polygon fill="#FFFFFF" points="15.66816,7.77344 9.6,2.27456 9.6,5.6 3.68,5.6 3.68,9.92 9.6,9.92 9.6,13.27232"/>
</g>
<path id="tour-shape" fill="#5A5A5A" d="M8,0C4.831,0,2.262,2.674,2.262,5.972c0,1.393,1.023,3.398,2.206,5.249l0.571,
0.866C6.504,14.245,8,16,8,16 s1.496-1.755,2.961-3.912l0.571-0.866c1.182-1.852,2.206-3.856,2.206-5.249C13.738,2.674,
11.169,0,8,0z M8,7.645 c-0.603,0-1.146-0.262-1.534-0.681C6.098,6.566,5.87,6.025,5.87,5.428c0-1.224,0.954-2.217,
2.13-2.217s2.13,0.992,2.13,2.217 C10.13,6.653,9.177,7.645,8,7.645z"/>
<g id="screen-shape">
<path d="M12.199,3.915v-0.4c0-0.837-0.65-1.515-1.452-1.515H2.452C1.65,2,1,2.678,1,3.515v6.242
c0,0.837,0.65,1.515,1.452,1.515h0.514V5.431c0-0.837,0.65-1.515,1.452-1.515H12.199z"/>
<path d="M13.548,4.727H5.253c-0.802,0-1.452,0.678-1.452,1.515v6.242c0,0.837,0.65,1.515,1.452,
1.515h8.294 C14.35,14,15,13.322,15,12.485V6.242C15,5.406,14.35,4.727,13.548,4.727z"/>
</g>
<g id="screenmute-shape">
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.55,4.73h-0.54l-8.13,8.13L4.2,13.53
C4.46,13.82,4.84,14,5.25,14h8.3c0.8,0,1.45-0.68,1.45-1.52V6.24C15,5.41,14.35,4.73,13.55,4.73z"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.21,2.72l-0.99-0.99l-1.15,1.15C11.83,2.36,11.33,2,10.75,2
h-8.3C1.65,2,1,2.68,1,3.52v6.24c0,0.83,0.65,1.51,1.45,1.51h0.52V5.43c0-0.84,0.65-1.51,1.45-1.51h6.61l-0.81,
0.81H5.25 c-0.8,0-1.45,0.68-1.45,1.51v4.91l-1.89,1.89l0.99,0.99l1-1l8.3-8.3L14.21,2.72z"/>
</g>
<g id="delete-shape">
<path fill="#CCCCCC" d="M14.191,4.579c0-1.149-0.832-2.08-1.857-2.08h-0.902V1.997C11.432,0.894,10.633,0,9.648,0H6.352
C5.367,0,4.568,0.894,4.568,1.997v0.502H3.666c-1.026,0-1.857,0.932-1.857,2.08v1.389h1.064l0.785,8.416
C3.742,15.29,4.499,16,5.383,16h5.231c0.883,0,1.64-0.709,1.724-1.614l0.788-8.417h1.064V4.579z M5.535,2.218V2.065
c0-0.58,0.42-1.05,0.938-1.05h3.055c0.518,0,0.937,0.47,0.937,1.05v0.153c0,0.098-0.016,0.191-0.038,0.281H5.573
C5.55,2.409,5.535,2.316,5.535,2.218z M11.184,14.277c-0.029,0.305-0.29,0.562-0.57,0.562H5.383c-0.281,0-0.541-0.257-0.57-0.562
L4.038,5.969h7.924L11.184,14.277z"/>
<rect x="7.612" y="7.291" fill="#CCCCCC" width="0.774" height="6.191"/>
<polyline fill="#CCCCCC" points="9.934,7.291 9.16,7.291 9.16,13.482 9.934,13.482 "/>
<rect x="6.065" y="7.291" fill="#CCCCCC" width="0.774" height="6.191"/>
</g>
</defs>
<use id="add" xlink:href="#add-shape"/>
<use id="add-hover" xlink:href="#add-shape"/>
<use id="add-active" xlink:href="#add-shape"/>
<use id="audio" xlink:href="#audio-shape"/>
<use id="audio-hover" xlink:href="#audio-shape"/>
<use id="audio-active" xlink:href="#audio-shape"/>
<use id="block" xlink:href="#block-shape"/>
<use id="block-red" xlink:href="#block-shape"/>
<use id="block-hover" xlink:href="#block-shape"/>
<use id="block-active" xlink:href="#block-shape"/>
<use id="contacts" xlink:href="#contacts-shape"/>
<use id="contacts-hover" xlink:href="#contacts-shape"/>
<use id="contacts-active" xlink:href="#contacts-shape"/>
<use id="copy" xlink:href="#copy-shape"/>
<use id="checkmark" xlink:href="#checkmark-shape"/>
<use id="google" xlink:href="#google-shape"/>
<use id="google-hover" xlink:href="#google-shape"/>
<use id="google-active" xlink:href="#google-shape"/>
<use id="history" xlink:href="#history-shape"/>
<use id="history-hover" xlink:href="#history-shape"/>
<use id="history-active" xlink:href="#history-shape"/>
<use id="leave" xlink:href="#leave-shape"/>
<use id="precall" xlink:href="#precall-shape"/>
<use id="precall-hover" xlink:href="#precall-shape"/>
<use id="precall-active" xlink:href="#precall-shape"/>
<use id="settings" xlink:href="#settings-shape"/>
<use id="settings-hover" xlink:href="#settings-shape"/>
<use id="settings-active" xlink:href="#settings-shape"/>
<use id="share-darkgrey" xlink:href="#share-shape"/>
<use id="tag" xlink:href="#tag-shape"/>
<use id="tag-hover" xlink:href="#tag-shape"/>
<use id="tag-active" xlink:href="#tag-shape"/>
<use id="trash" xlink:href="#trash-shape"/>
<use id="unblock" xlink:href="#unblock-shape"/>
<use id="unblock-hover" xlink:href="#unblock-shape"/>
<use id="unblock-active" xlink:href="#unblock-shape"/>
<use id="video" xlink:href="#video-shape"/>
<use id="video-hover" xlink:href="#video-shape"/>
<use id="video-active" xlink:href="#video-shape"/>
<use id="tour" xlink:href="#tour-shape"/>
<use id="screen-white" xlink:href="#screen-shape"/>
<use id="screen-disabled" xlink:href="#screen-shape"/>
<use id="screenmute-white" xlink:href="#screenmute-shape"/>
<use id="delete" xlink:href="#delete-shape"/>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 16 16">
<style>
use:not(:target) {
display: none;
}
use {
fill: #ccc;
}
use[id$="-hover"] {
fill: #444;
}
use[id$="-active"] {
fill: #0095dd;
}
use[id$="-red"] {
fill: #d74345
}
use[id$="-white"] {
fill: #fff;
}
use[id$="-darkgrey"] {
fill: #666;
}
use[id$="-disabled"] {
fill: rgba(255,255,255,.6);
}
</style>
<defs>
<polygon id="add-shape" points="16,6.4 9.6,6.4 9.6,0 6.4,0 6.4,6.4 0,6.4 0,9.6 6.4,9.6 6.4,16 9.6,16 9.6,9.6 16,9.6"/>
<path id="audio-shape" fill-rule="evenodd" d="M11.429,6.857v2.286c0,1.894-1.535,3.429-3.429,3.429 c-1.894,0-3.429-1.535-3.429-3.429V6.857H3.429v2.286c0,2.129,1.458,3.913,3.429,4.422v1.293H6.286 c-0.746,0-1.379,0.477-1.615,1.143h6.658c-0.236-0.665-0.869-1.143-1.615-1.143H9.143v-1.293c1.971-0.508,3.429-2.292,3.429-4.422 V6.857H11.429z M8,12c1.578,0,2.857-1.279,2.857-2.857V2.857C10.857,1.279,9.578,0,8,0C6.422,0,5.143,1.279,5.143,2.857v6.286 C5.143,10.721,6.422,12,8,12z"/>
<path id="block-shape" fill-rule="evenodd" d="M8,0C3.582,0,0,3.582,0,8c0,4.418,3.582,8,8,8 c4.418,0,8-3.582,8-8C16,3.582,12.418,0,8,0z M8,2.442c1.073,0,2.075,0.301,2.926,0.821l-7.673,7.673 C2.718,10.085,2.408,9.079,2.408,8C2.408,4.931,4.911,2.442,8,2.442z M8,13.557c-1.073,0-2.075-0.301-2.926-0.821l7.673-7.673 C13.282,5.915,13.592,6.921,13.592,8C13.592,11.069,11.089,13.557,8,13.557z"/>
<path id="contacts-shape" fill-rule="evenodd" d="M8,6.526c1.802,0,3.263-1.461,3.263-3.263 C11.263,1.461,9.802,0,8,0C6.198,0,4.737,1.461,4.737,3.263C4.737,5.066,6.198,6.526,8,6.526z M14.067,11.421c0,0,0-0.001,0-0.001 c0-1.676-1.397-3.119-3.419-3.807L8.001,10.26L5.354,7.613C3.331,8.3,1.933,9.744,1.933,11.42v0.001H1.93 c0,1.679,0.328,3.246,0.896,4.579h10.348c0.568-1.333,0.896-2.9,0.896-4.579H14.067z"/>
<g id="google-shape">
<path fill-rule="evenodd" d="M8.001,9.278c-0.9,0.03-1.989,0.454-2.144,1.274 c-0.292,1.54,1.284,2.004,2.455,1.932c1.097-0.067,1.737-0.593,1.813-1.26c0.063-0.554-0.184-1.153-0.959-1.644 c-0.142-0.09-0.28-0.185-0.413-0.282C8.504,9.291,8.25,9.27,8.001,9.278z"/>
<path fill-rule="evenodd" d="M7.381,3.409C6.638,3.64,6.32,4.405,6.627,5.61 C6.908,6.708,7.78,7.322,8.569,7.104c0.77-0.213,0.987-1.021,0.847-1.873C9.201,3.929,8.261,3.136,7.381,3.409z"/>
<path fill-rule="evenodd" d="M8,0C3.582,0,0,3.582,0,8s3.582,8,8,8c4.418,0,8-3.582,8-8 S12.418,0,8,0z M10.544,4.471c0.17,0.453,0.194,0.954,0.021,1.416c-0.163,0.436-0.495,0.811-0.982,1.096 C9.307,7.146,9.167,7.351,9.151,7.548c-0.045,0.575,0.658,0.993,1.064,1.297c0.889,0.666,1.236,1.758,0.648,2.813 c-0.562,1.007-1.901,1.457-3.322,1.462c-1.766-0.008-2.88-0.817-2.938-1.918C4.527,9.779,5.987,9.101,7.307,8.947 c0.369-0.043,0.7-0.036,1.01-0.014C7.85,8.625,7.675,7.998,7.914,7.58c0.062-0.109,0.023-0.072-0.095-0.054 C6.739,7.689,5.628,6.985,5.367,5.92c-0.132-0.54-0.05-1.105,0.156-1.547C5.97,3.413,6.964,2.88,8.067,2.88 c1.147,0,2.209,0,3.334,0.009L10.612,3.4H9.714C10.093,3.665,10.384,4.046,10.544,4.471z"/>
</g>
<path id="history-shape" fill-rule="evenodd" d="M8,16c-4.418,0-8-3.582-8-8c0-4.418,3.582-8,8-8 c4.418,0,8,3.582,8,8C16,12.418,12.418,16,8,16z M8,2.442C4.911,2.442,2.408,4.931,2.408,8c0,3.069,2.504,5.557,5.592,5.557 S13.592,11.069,13.592,8C13.592,4.931,11.089,2.442,8,2.442z M7.649,9.048C7.206,8.899,6.882,8.493,6.882,8V4.645 c0-0.618,0.501-1.119,1.118-1.119c0.618,0,1.119,0.501,1.119,1.119v3.078c1.176,1.22,2.237,3.633,2.237,3.633 S8.844,10.252,7.649,9.048z"/>
<path id="precall-shape" fill-rule="evenodd" d="M8.014,0.003c-4.411,0-7.987,3.576-7.987,7.986 c0,1.642,0.496,3.168,1.346,4.437L0,15.997l3.568-1.372c1.271,0.853,2.8,1.352,4.446,1.352c4.411,0,7.986-3.576,7.986-7.987 C16,3.579,12.424,0.003,8.014,0.003z"/>
<path id="settings-shape" fill-rule="evenodd" d="M14.77,8c0,0.804,0.262,1.548,0.634,1.678L16,9.887 c-0.205,0.874-0.553,1.692-1.011,2.434l-0.567-0.272c-0.355-0.171-1.066,0.17-1.635,0.738c-0.569,0.569-0.909,1.279-0.738,1.635 l0.273,0.568c-0.741,0.46-1.566,0.79-2.438,0.998l-0.205-0.584c-0.13-0.372-0.874-0.634-1.678-0.634s-1.548,0.262-1.678,0.634 l-0.209,0.596c-0.874-0.205-1.692-0.553-2.434-1.011l0.272-0.567c0.171-0.355-0.17-1.066-0.739-1.635 c-0.568-0.568-1.279-0.909-1.635-0.738l-0.568,0.273c-0.46-0.741-0.79-1.566-0.998-2.439l0.584-0.205 C0.969,9.547,1.231,8.804,1.231,8c0-0.804-0.262-1.548-0.634-1.678L0,6.112c0.206-0.874,0.565-1.685,1.025-2.427l0.554,0.266 c0.355,0.171,1.066-0.17,1.635-0.738c0.569-0.568,0.909-1.28,0.739-1.635L3.686,1.025c0.742-0.46,1.553-0.818,2.427-1.024 l0.209,0.596C6.453,0.969,7.197,1.23,8.001,1.23s1.548-0.262,1.678-0.634l0.209-0.596c0.874,0.205,1.692,0.553,2.434,1.011 l-0.272,0.567c-0.171,0.355,0.17,1.066,0.738,1.635c0.569,0.568,1.279,0.909,1.635,0.738l0.568-0.273 c0.46,0.741,0.79,1.566,0.998,2.438l-0.584,0.205C15.032,6.452,14.77,7.196,14.77,8z M8.001,3.661C5.604,3.661,3.661,5.603,3.661,8 c0,2.397,1.943,4.34,4.339,4.34c2.397,0,4.339-1.943,4.339-4.34C12.34,5.603,10.397,3.661,8.001,3.661z"/>
<g id="share-shape">
<path fill-rule="evenodd" d="M8.999,10.654L8.69,10.6L8.999,16l2.56-3.754L8.999,10.654z M8.658,10.041l0.341-0.043l6,2.898V0L1,10.998l4.55-0.569L8.999,16l-1.892-5.68l-0.283-0.05l0.256-0.032L7,9.998l6.999-8.003 L8.656,9.998L8.658,10.041z"/>
</g>
<path id="tag-shape" fill-rule="evenodd" d="M15.578,7.317L9.659,1.398 C9.374,1.033,8.955,0.777,8.471,0.761L2.556,0C1.72-0.027-0.027,1.72,0,2.556l0.761,5.916c0.016,0.484,0.272,0.902,0.637,1.188 l5.919,5.919c0.591,0.591,1.584,0.557,2.218-0.076l5.966-5.966C16.135,8.902,16.169,7.909,15.578,7.317z M4.222,4.163 c-0.511,0.511-1.339,0.511-1.85,0c-0.511-0.511-0.511-1.339,0-1.85c0.511-0.511,1.339-0.511,1.85,0 C4.733,2.823,4.733,3.652,4.222,4.163z"/>
<path id="unblock-shape" fill-rule="evenodd" d="M8,16c-4.418,0-8-3.582-8-8c0-4.418,3.582-8,8-8 c4.418,0,8,3.582,8,8C16,12.418,12.418,16,8,16z M8,2.442C4.911,2.442,2.408,4.931,2.408,8c0,3.069,2.504,5.557,5.592,5.557 S13.592,11.069,13.592,8C13.592,4.931,11.089,2.442,8,2.442z"/>
<path id="video-shape" fill-rule="evenodd" d="M14.9,3.129l-3.476,3.073V3.873c0-0.877-0.663-1.587-1.482-1.587 H1.482C0.663,2.286,0,2.996,0,3.873v8.254c0,0.877,0.663,1.587,1.482,1.587h8.461c0.818,0,1.482-0.711,1.482-1.587V9.762 l3.476,3.073c0.3,0.321,0.714,0.416,1.1,0.331V2.798C15.614,2.713,15.2,2.808,14.9,3.129z"/>
<g id="copy-shape">
<circle fill="#0096dd" cx="8" cy="8" r="8"/>
<path fill-rule="evenodd" fill="none" stroke="#fff" stroke-width="0.75" stroke-miterlimit="10" d="M10.815,6.286H7.556c-0.164,0-0.296,0.128-0.296,0.286v5.143C7.259,11.872,7.392,12,7.556,12h4.148 C11.867,12,12,11.872,12,11.714V7.429L10.815,6.286z M8.741,6.275V5.143L7.556,4H7.528C6.509,4,4.593,4,4.593,4H4.296 C4.133,4,4,4.128,4,4.286v5.143c0,0.158,0.133,0.286,0.296,0.286H7.25V6.561c0-0.158,0.133-0.286,0.296-0.286H8.741z"/>
<polygon fill="#fff" points="10.222,8 10.222,6.857 11.407,8"/>
<polygon fill="#fff" points="6.963,5.714 6.963,4.571 8.148,5.714"/>
</g>
<g id="checkmark-shape">
<circle fill="#0096dd" cx="8" cy="8" r="8"/>
<path fill-rule="evenodd" fill="#fff" d="M7.236,12L12,5.007L10.956,4L7.224,9.465l-2.14-2.326L4,8.146L7.236,12z"/>
</g>
<g id="trash-shape">
<circle fill="#d74345" cx="8" cy="8" r="8"/>
<path fill="#fff" d="M12,5.79c0-0.742-0.537-1.344-1.2-1.344h-0.583V4.121c0-0.713-0.516-1.29-1.152-1.29h-2.13 c-0.636,0-1.152,0.578-1.152,1.29v0.324H5.2C4.537,4.446,4,5.048,4,5.79v0.898h0.687l0.508,5.438 c0.054,0.585,0.543,1.044,1.114,1.044h3.38c0.57,0,1.06-0.458,1.114-1.043l0.509-5.439H12V5.79z M6.407,4.264V4.165 c0-0.375,0.271-0.678,0.606-0.678h1.974c0.334,0,0.606,0.304,0.606,0.678v0.099c0,0.063-0.01,0.123-0.025,0.181H6.432 C6.417,4.387,6.407,4.328,6.407,4.264z M10.057,12.056c-0.019,0.197-0.188,0.363-0.368,0.363h-3.38 c-0.182,0-0.35-0.166-0.368-0.363L5.44,6.687h5.12L10.057,12.056z"/>
<rect x="7.75" y="7.542" fill="#fff" width="0.5" height="4"/>
<polyline fill="#fff" points="9.25,7.542 8.75,7.542 8.75,11.542 9.25,11.542 "/>
<rect x="6.75" y="7.542" fill="#fff" width="0.5" height="4"/>
</g>
<g id="leave-shape">
<polygon fill="#fff" points="2.08,11.52 2.08,4 8,4 8,2.24 0.32,2.24 0.32,13.28 8,13.28 8,11.52"/>
<polygon fill="#fff" points="15.66816,7.77344 9.6,2.27456 9.6,5.6 3.68,5.6 3.68,9.92 9.6,9.92 9.6,13.27232"/>
</g>
<path id="tour-shape" fill="#5a5a5a" d="M8,0C4.831,0,2.262,2.674,2.262,5.972c0,1.393,1.023,3.398,2.206,5.249l0.571, 0.866C6.504,14.245,8,16,8,16 s1.496-1.755,2.961-3.912l0.571-0.866c1.182-1.852,2.206-3.856,2.206-5.249C13.738,2.674, 11.169,0,8,0z M8,7.645 c-0.603,0-1.146-0.262-1.534-0.681C6.098,6.566,5.87,6.025,5.87,5.428c0-1.224,0.954-2.217, 2.13-2.217s2.13,0.992,2.13,2.217 C10.13,6.653,9.177,7.645,8,7.645z"/>
<g id="screen-shape">
<path d="M12.199,3.915v-0.4c0-0.837-0.65-1.515-1.452-1.515H2.452C1.65,2,1,2.678,1,3.515v6.242 c0,0.837,0.65,1.515,1.452,1.515h0.514V5.431c0-0.837,0.65-1.515,1.452-1.515H12.199z"/>
<path d="M13.548,4.727H5.253c-0.802,0-1.452,0.678-1.452,1.515v6.242c0,0.837,0.65,1.515,1.452, 1.515h8.294 C14.35,14,15,13.322,15,12.485V6.242C15,5.406,14.35,4.727,13.548,4.727z"/>
</g>
<g id="screenmute-shape">
<path fill-rule="evenodd" d="M13.55,4.73h-0.54l-8.13,8.13L4.2,13.53 C4.46,13.82,4.84,14,5.25,14h8.3c0.8,0,1.45-0.68,1.45-1.52V6.24C15,5.41,14.35,4.73,13.55,4.73z"/>
<path fill-rule="evenodd" d="M14.21,2.72l-0.99-0.99l-1.15,1.15C11.83,2.36,11.33,2,10.75,2 h-8.3C1.65,2,1,2.68,1,3.52v6.24c0,0.83,0.65,1.51,1.45,1.51h0.52V5.43c0-0.84,0.65-1.51,1.45-1.51h6.61l-0.81, 0.81H5.25 c-0.8,0-1.45,0.68-1.45,1.51v4.91l-1.89,1.89l0.99,0.99l1-1l8.3-8.3L14.21,2.72z"/>
</g>
<g id="delete-shape">
<path fill="#ccc" d="M14.191,4.579c0-1.149-0.832-2.08-1.857-2.08h-0.902V1.997C11.432,0.894,10.633,0,9.648,0H6.352 C5.367,0,4.568,0.894,4.568,1.997v0.502H3.666c-1.026,0-1.857,0.932-1.857,2.08v1.389h1.064l0.785,8.416 C3.742,15.29,4.499,16,5.383,16h5.231c0.883,0,1.64-0.709,1.724-1.614l0.788-8.417h1.064V4.579z M5.535,2.218V2.065 c0-0.58,0.42-1.05,0.938-1.05h3.055c0.518,0,0.937,0.47,0.937,1.05v0.153c0,0.098-0.016,0.191-0.038,0.281H5.573 C5.55,2.409,5.535,2.316,5.535,2.218z M11.184,14.277c-0.029,0.305-0.29,0.562-0.57,0.562H5.383c-0.281,0-0.541-0.257-0.57-0.562 L4.038,5.969h7.924L11.184,14.277z"/>
<rect x="7.612" y="7.291" fill="#ccc" width="0.774" height="6.191"/>
<polyline fill="#ccc" points="9.934,7.291 9.16,7.291 9.16,13.482 9.934,13.482 "/>
<rect x="6.065" y="7.291" fill="#ccc" width="0.774" height="6.191"/>
</g>
</defs>
<use id="add" xlink:href="#add-shape"/>
<use id="add-hover" xlink:href="#add-shape"/>
<use id="add-active" xlink:href="#add-shape"/>
<use id="audio" xlink:href="#audio-shape"/>
<use id="audio-hover" xlink:href="#audio-shape"/>
<use id="audio-active" xlink:href="#audio-shape"/>
<use id="block" xlink:href="#block-shape"/>
<use id="block-red" xlink:href="#block-shape"/>
<use id="block-hover" xlink:href="#block-shape"/>
<use id="block-active" xlink:href="#block-shape"/>
<use id="contacts" xlink:href="#contacts-shape"/>
<use id="contacts-hover" xlink:href="#contacts-shape"/>
<use id="contacts-active" xlink:href="#contacts-shape"/>
<use id="copy" xlink:href="#copy-shape"/>
<use id="checkmark" xlink:href="#checkmark-shape"/>
<use id="google" xlink:href="#google-shape"/>
<use id="google-hover" xlink:href="#google-shape"/>
<use id="google-active" xlink:href="#google-shape"/>
<use id="history" xlink:href="#history-shape"/>
<use id="history-hover" xlink:href="#history-shape"/>
<use id="history-active" xlink:href="#history-shape"/>
<use id="leave" xlink:href="#leave-shape"/>
<use id="precall" xlink:href="#precall-shape"/>
<use id="precall-hover" xlink:href="#precall-shape"/>
<use id="precall-active" xlink:href="#precall-shape"/>
<use id="settings" xlink:href="#settings-shape"/>
<use id="settings-hover" xlink:href="#settings-shape"/>
<use id="settings-active" xlink:href="#settings-shape"/>
<use id="share-darkgrey" xlink:href="#share-shape"/>
<use id="tag" xlink:href="#tag-shape"/>
<use id="tag-hover" xlink:href="#tag-shape"/>
<use id="tag-active" xlink:href="#tag-shape"/>
<use id="trash" xlink:href="#trash-shape"/>
<use id="unblock" xlink:href="#unblock-shape"/>
<use id="unblock-hover" xlink:href="#unblock-shape"/>
<use id="unblock-active" xlink:href="#unblock-shape"/>
<use id="video" xlink:href="#video-shape"/>
<use id="video-hover" xlink:href="#video-shape"/>
<use id="video-active" xlink:href="#video-shape"/>
<use id="tour" xlink:href="#tour-shape"/>
<use id="screen-white" xlink:href="#screen-shape"/>
<use id="screen-disabled" xlink:href="#screen-shape"/>
<use id="screenmute-white" xlink:href="#screenmute-shape"/>
<use id="delete" xlink:href="#delete-shape"/>
</svg>

До

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

После

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

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

@ -1,12 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<g id="Contacts">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#231F20" d="M8,6.526c1.802,0,3.263-1.461,3.263-3.263
C11.263,1.461,9.802,0,8,0C6.198,0,4.737,1.461,4.737,3.263C4.737,5.066,6.198,6.526,8,6.526z M14.067,11.421c0,0,0-0.001,0-0.001
c0-1.676-1.397-3.119-3.419-3.807L8.001,10.26L5.354,7.613C3.331,8.3,1.933,9.744,1.933,11.42v0.001H1.93
c0,1.679,0.328,3.246,0.896,4.579h10.348c0.568-1.333,0.896-2.9,0.896-4.579H14.067z"/>
</g>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<path fill-rule="evenodd" fill="#231f20" d="M8,6.526c1.802,0,3.263-1.461,3.263-3.263 C11.263,1.461,9.802,0,8,0C6.198,0,4.737,1.461,4.737,3.263C4.737,5.066,6.198,6.526,8,6.526z M14.067,11.421c0,0,0-0.001,0-0.001 c0-1.676-1.397-3.119-3.419-3.807L8.001,10.26L5.354,7.613C3.331,8.3,1.933,9.744,1.933,11.42v0.001H1.93 c0,1.679,0.328,3.246,0.896,4.579h10.348c0.568-1.333,0.896-2.9,0.896-4.579H14.067z"/>
</svg>

До

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

После

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

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

@ -2,14 +2,7 @@
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<circle fill="#5A5A5A" cx="8" cy="8" r="8"/>
<g>
<path fill="#FFFFFF" d="M10.716,5.643c0,1.943-2.158,1.812-2.158,3.154v0.3H6.831V8.726c0-2.075,1.907-1.932,1.907-2.915
c0-0.432-0.312-0.684-0.84-0.684c-0.491,0-0.972,0.24-1.403,0.731L5.284,4.923C5.967,4.121,6.855,3.64,8.09,3.64
C9.841,3.64,10.716,4.576,10.716,5.643z M8.797,11.268c0,0.6-0.479,1.092-1.079,1.092s-1.079-0.492-1.079-1.092
c0-0.588,0.479-1.079,1.079-1.079S8.797,10.68,8.797,11.268z"/>
</g>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<circle fill="#5a5a5a" cx="8" cy="8" r="8"/>
<path fill="#fff" d="M10.716,5.643c0,1.943-2.158,1.812-2.158,3.154v0.3H6.831V8.726c0-2.075,1.907-1.932,1.907-2.915 c0-0.432-0.312-0.684-0.84-0.684c-0.491,0-0.972,0.24-1.403,0.731L5.284,4.923C5.967,4.121,6.855,3.64,8.09,3.64 C9.841,3.64,10.716,4.576,10.716,5.643z M8.797,11.268c0,0.6-0.479,1.092-1.079,1.092s-1.079-0.492-1.079-1.092 c0-0.588,0.479-1.079,1.079-1.079S8.797,10.68,8.797,11.268z"/>
</svg>

До

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

После

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

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

@ -1,17 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<path id="Setting" fill-rule="evenodd" clip-rule="evenodd" fill="#131311" d="M14.77,8c0,0.804,0.262,1.548,0.634,1.678L16,9.887
c-0.205,0.874-0.553,1.692-1.011,2.434l-0.567-0.272c-0.355-0.171-1.066,0.17-1.635,0.738c-0.569,0.569-0.909,1.279-0.738,1.635
l0.273,0.568c-0.741,0.46-1.566,0.79-2.438,0.998l-0.205-0.584c-0.13-0.372-0.874-0.634-1.678-0.634s-1.548,0.262-1.678,0.634
l-0.209,0.596c-0.874-0.205-1.692-0.553-2.434-1.011l0.272-0.567c0.171-0.355-0.17-1.066-0.739-1.635
c-0.568-0.568-1.279-0.909-1.635-0.738l-0.568,0.273c-0.46-0.741-0.79-1.566-0.998-2.439l0.584-0.205
C0.969,9.547,1.231,8.804,1.231,8c0-0.804-0.262-1.548-0.634-1.678L0,6.112c0.206-0.874,0.565-1.685,1.025-2.427l0.554,0.266
c0.355,0.171,1.066-0.17,1.635-0.738c0.569-0.568,0.909-1.28,0.739-1.635L3.686,1.025c0.742-0.46,1.553-0.818,2.427-1.024
l0.209,0.596C6.453,0.969,7.197,1.23,8.001,1.23s1.548-0.262,1.678-0.634l0.209-0.596c0.874,0.205,1.692,0.553,2.434,1.011
l-0.272,0.567c-0.171,0.355,0.17,1.066,0.738,1.635c0.569,0.568,1.279,0.909,1.635,0.738l0.568-0.273
c0.46,0.741,0.79,1.566,0.998,2.438l-0.584,0.205C15.032,6.452,14.77,7.196,14.77,8z M8.001,3.661C5.604,3.661,3.661,5.603,3.661,8
c0,2.397,1.943,4.34,4.339,4.34c2.397,0,4.339-1.943,4.339-4.34C12.34,5.603,10.397,3.661,8.001,3.661z"/>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<path fill-rule="evenodd" fill="#131311" d="M14.77,8c0,0.804,0.262,1.548,0.634,1.678L16,9.887 c-0.205,0.874-0.553,1.692-1.011,2.434l-0.567-0.272c-0.355-0.171-1.066,0.17-1.635,0.738c-0.569,0.569-0.909,1.279-0.738,1.635 l0.273,0.568c-0.741,0.46-1.566,0.79-2.438,0.998l-0.205-0.584c-0.13-0.372-0.874-0.634-1.678-0.634s-1.548,0.262-1.678,0.634 l-0.209,0.596c-0.874-0.205-1.692-0.553-2.434-1.011l0.272-0.567c0.171-0.355-0.17-1.066-0.739-1.635 c-0.568-0.568-1.279-0.909-1.635-0.738l-0.568,0.273c-0.46-0.741-0.79-1.566-0.998-2.439l0.584-0.205 C0.969,9.547,1.231,8.804,1.231,8c0-0.804-0.262-1.548-0.634-1.678L0,6.112c0.206-0.874,0.565-1.685,1.025-2.427l0.554,0.266 c0.355,0.171,1.066-0.17,1.635-0.738c0.569-0.568,0.909-1.28,0.739-1.635L3.686,1.025c0.742-0.46,1.553-0.818,2.427-1.024 l0.209,0.596C6.453,0.969,7.197,1.23,8.001,1.23s1.548-0.262,1.678-0.634l0.209-0.596c0.874,0.205,1.692,0.553,2.434,1.011 l-0.272,0.567c-0.171,0.355,0.17,1.066,0.738,1.635c0.569,0.568,1.279,0.909,1.635,0.738l0.568-0.273 c0.46,0.741,0.79,1.566,0.998,2.438l-0.584,0.205C15.032,6.452,14.77,7.196,14.77,8z M8.001,3.661C5.604,3.661,3.661,5.603,3.661,8 c0,2.397,1.943,4.34,4.339,4.34c2.397,0,4.339-1.943,4.339-4.34C12.34,5.603,10.397,3.661,8.001,3.661z"/>
</svg>

До

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

После

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

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

@ -1,15 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<g id="Outgoing_14x14_1_">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#231F20" d="M9.921,8.415c0.105-0.11,0.146-0.265,0.13-0.432
c0.016-0.166-0.025-0.321-0.13-0.429L9.305,6.938l-2.6-2.65C6.402,3.973,5.973,3.906,5.748,4.139L5.238,4.68
c-0.225,0.233-0.16,0.679,0.144,0.995L6.44,6.754H0.608C0.272,6.754,0,7.026,0,7.361l0,1.215c0,0.335,0.272,0.607,0.608,0.607H6.47
l-1.136,1.155c-0.305,0.313-0.369,0.756-0.144,0.987L5.7,11.861c0.225,0.233,0.654,0.166,0.959-0.149l2.619-2.663L9.921,8.415z"/>
</g>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#231F20" d="M14,0H5.558c-0.331,0-0.6,0.269-0.6,0.6v0.8
c0,0.331,0.269,0.6,0.6,0.6H12.5C13.328,2,14,2.672,14,3.5v9c0,0.828-0.672,1.5-1.5,1.5H5.558c-0.331,0-0.6,0.269-0.6,0.6v0.8
c0,0.331,0.269,0.6,0.6,0.6H14c1.105,0,2-0.895,2-2V2C16,0.895,15.105,0,14,0z"/>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<path fill-rule="evenodd" fill="#231f20" d="M9.921,8.415c0.105-0.11,0.146-0.265,0.13-0.432 c0.016-0.166-0.025-0.321-0.13-0.429L9.305,6.938l-2.6-2.65C6.402,3.973,5.973,3.906,5.748,4.139L5.238,4.68 c-0.225,0.233-0.16,0.679,0.144,0.995L6.44,6.754H0.608C0.272,6.754,0,7.026,0,7.361l0,1.215c0,0.335,0.272,0.607,0.608,0.607H6.47 l-1.136,1.155c-0.305,0.313-0.369,0.756-0.144,0.987L5.7,11.861c0.225,0.233,0.654,0.166,0.959-0.149l2.619-2.663L9.921,8.415z"/>
<path fill-rule="evenodd" fill="#231f20" d="M14,0H5.558c-0.331,0-0.6,0.269-0.6,0.6v0.8 c0,0.331,0.269,0.6,0.6,0.6H12.5C13.328,2,14,2.672,14,3.5v9c0,0.828-0.672,1.5-1.5,1.5H5.558c-0.331,0-0.6,0.269-0.6,0.6v0.8 c0,0.331,0.269,0.6,0.6,0.6H14c1.105,0,2-0.895,2-2V2C16,0.895,15.105,0,14,0z"/>
</svg>

До

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

После

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

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

@ -1,16 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#231F20" d="M14,0H5.558c-0.331,0-0.6,0.269-0.6,0.6v0.8
c0,0.331,0.269,0.6,0.6,0.6H12.5C13.328,2,14,2.672,14,3.5v9c0,0.828-0.672,1.5-1.5,1.5H5.558c-0.331,0-0.6,0.269-0.6,0.6v0.8
c0,0.331,0.269,0.6,0.6,0.6H14c1.105,0,2-0.895,2-2V2C16,0.895,15.105,0,14,0z"/>
<g id="Outgoing_14x14_2_">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#231F20" d="M0.133,7.585c-0.105,0.11-0.146,0.265-0.13,0.432
c-0.016,0.166,0.025,0.321,0.13,0.429l0.616,0.615l2.6,2.65c0.304,0.315,0.732,0.382,0.958,0.149l0.51-0.541
c0.225-0.233,0.16-0.679-0.144-0.995L3.615,9.246h5.832c0.335,0,0.608-0.272,0.608-0.607V7.424c0-0.335-0.272-0.607-0.608-0.607
H3.585L4.72,5.662c0.305-0.313,0.369-0.756,0.144-0.987L4.355,4.139C4.13,3.906,3.701,3.973,3.396,4.287L0.777,6.951L0.133,7.585z"
/>
</g>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<path fill-rule="evenodd" fill="#231f20" d="M14,0H5.558c-0.331,0-0.6,0.269-0.6,0.6v0.8 c0,0.331,0.269,0.6,0.6,0.6H12.5C13.328,2,14,2.672,14,3.5v9c0,0.828-0.672,1.5-1.5,1.5H5.558c-0.331,0-0.6,0.269-0.6,0.6v0.8 c0,0.331,0.269,0.6,0.6,0.6H14c1.105,0,2-0.895,2-2V2C16,0.895,15.105,0,14,0z"/>
<path fill-rule="evenodd" fill="#231f20" d="M0.133,7.585c-0.105,0.11-0.146,0.265-0.13,0.432 c-0.016,0.166,0.025,0.321,0.13,0.429l0.616,0.615l2.6,2.65c0.304,0.315,0.732,0.382,0.958,0.149l0.51-0.541 c0.225-0.233,0.16-0.679-0.144-0.995L3.615,9.246h5.832c0.335,0,0.608-0.272,0.608-0.607V7.424c0-0.335-0.272-0.607-0.608-0.607 H3.585L4.72,5.662c0.305-0.313,0.369-0.756,0.144-0.987L4.355,4.139C4.13,3.906,3.701,3.973,3.396,4.287L0.777,6.951L0.133,7.585z"/>
</svg>

До

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

После

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

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

@ -165,6 +165,28 @@ loop.shared.actions = (function() {
RemotePeerConnected: Action.define("remotePeerConnected", {
}),
/**
* Used to notify that the session has a data channel available.
*/
DataChannelsAvailable: Action.define("dataChannelsAvailable", {
}),
/**
* Used to send a message to the other peer.
*/
SendTextChatMessage: Action.define("sendTextChatMessage", {
contentType: String,
message: String
}),
/**
* Notifies that a message has been received from the other peer.
*/
ReceivedTextChatMessage: Action.define("receivedTextChatMessage", {
contentType: String,
message: String
}),
/**
* Used by the ongoing views to notify stores about the elements
* required for the sdk.

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

@ -372,6 +372,8 @@ loop.store.ActiveRoomStore = (function() {
*/
_handleRoomUpdate: function(eventName, roomData) {
this.dispatchAction(new sharedActions.UpdateRoomInfo({
urls: roomData.decryptedContext.urls,
description: roomData.decryptedContext.description,
roomName: roomData.decryptedContext.roomName,
roomOwner: roomData.roomOwner,
roomUrl: roomData.roomUrl
@ -410,7 +412,20 @@ loop.store.ActiveRoomStore = (function() {
this.setStoreState({failureReason: undefined});
}
this.setStoreState({roomState: ROOM_STATES.MEDIA_WAIT});
// XXX Ideally we'd do this check before joining a room, but we're waiting
// for the UX for that. See bug 1166824. In the meantime this gives us
// additional information for analysis.
loop.shared.utils.hasAudioDevices(function(hasAudio) {
if (hasAudio) {
// MEDIA_WAIT causes the views to dispatch sharedActions.SetupStreamElements,
// which in turn starts the sdk obtaining the device permission.
this.setStoreState({roomState: ROOM_STATES.MEDIA_WAIT});
} else {
this.dispatchAction(new sharedActions.ConnectionFailure({
reason: FAILURE_DETAILS.NO_MEDIA
}));
}
}.bind(this));
},
/**

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

@ -169,6 +169,7 @@ loop.shared.views.FeedbackView = (function(l10n) {
*/
var FeedbackReceived = React.createClass({displayName: "FeedbackReceived",
propTypes: {
noCloseText: React.PropTypes.bool,
onAfterFeedbackReceived: React.PropTypes.func
},
@ -195,14 +196,24 @@ loop.shared.views.FeedbackView = (function(l10n) {
}
},
_renderCloseText: function() {
if (this.props.noCloseText) {
return null;
}
return (
React.createElement("p", {className: "info thank-you"},
l10n.get("feedback_window_will_close_in2", {
countdown: this.state.countdown,
num: this.state.countdown
}))
);
},
render: function() {
return (
React.createElement(FeedbackLayout, {title: l10n.get("feedback_thank_you_heading")},
React.createElement("p", {className: "info thank-you"},
l10n.get("feedback_window_will_close_in2", {
countdown: this.state.countdown,
num: this.state.countdown
}))
this._renderCloseText()
)
);
}
@ -220,7 +231,8 @@ loop.shared.views.FeedbackView = (function(l10n) {
propTypes: {
onAfterFeedbackReceived: React.PropTypes.func,
// Used by the UI showcase.
feedbackState: React.PropTypes.string
feedbackState: React.PropTypes.string,
noCloseText: React.PropTypes.bool
},
getInitialState: function() {
@ -291,6 +303,7 @@ loop.shared.views.FeedbackView = (function(l10n) {
}
return (
React.createElement(FeedbackReceived, {
noCloseText: this.props.noCloseText,
onAfterFeedbackReceived: this.props.onAfterFeedbackReceived})
);
}

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

@ -169,6 +169,7 @@ loop.shared.views.FeedbackView = (function(l10n) {
*/
var FeedbackReceived = React.createClass({
propTypes: {
noCloseText: React.PropTypes.bool,
onAfterFeedbackReceived: React.PropTypes.func
},
@ -195,14 +196,24 @@ loop.shared.views.FeedbackView = (function(l10n) {
}
},
_renderCloseText: function() {
if (this.props.noCloseText) {
return null;
}
return (
<p className="info thank-you">{
l10n.get("feedback_window_will_close_in2", {
countdown: this.state.countdown,
num: this.state.countdown
})}</p>
);
},
render: function() {
return (
<FeedbackLayout title={l10n.get("feedback_thank_you_heading")}>
<p className="info thank-you">{
l10n.get("feedback_window_will_close_in2", {
countdown: this.state.countdown,
num: this.state.countdown
})}</p>
{this._renderCloseText()}
</FeedbackLayout>
);
}
@ -220,7 +231,8 @@ loop.shared.views.FeedbackView = (function(l10n) {
propTypes: {
onAfterFeedbackReceived: React.PropTypes.func,
// Used by the UI showcase.
feedbackState: React.PropTypes.string
feedbackState: React.PropTypes.string,
noCloseText: React.PropTypes.bool
},
getInitialState: function() {
@ -291,6 +303,7 @@ loop.shared.views.FeedbackView = (function(l10n) {
}
return (
<FeedbackReceived
noCloseText={this.props.noCloseText}
onAfterFeedbackReceived={this.props.onAfterFeedbackReceived} />
);
}

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

@ -515,7 +515,7 @@ loop.shared.mixins = (function() {
this._bufferedUpdateVideo = null;
var localStreamParent = this._getElement(".local .OT_publisher");
var remoteStreamParent = this._getElement(".remote .OT_subscriber");
var screenShareStreamParent = this._getElement('.screen .OT_subscriber');
var screenShareStreamParent = this._getElement(".screen .OT_subscriber");
if (localStreamParent) {
localStreamParent.style.width = "100%";
}

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

@ -25,6 +25,7 @@ loop.OTSdkDriver = (function() {
this.dispatcher = options.dispatcher;
this.sdk = options.sdk;
this._useDataChannels = !!options.useDataChannels;
this._isDesktop = !!options.isDesktop;
if (this._isDesktop) {
@ -77,10 +78,24 @@ loop.OTSdkDriver = (function() {
* Clones the publisher config into a new object, as the sdk modifies the
* properties object.
*/
_getCopyPublisherConfig: function() {
get _getCopyPublisherConfig() {
return _.extend({}, this.publisherConfig);
},
/**
* Returns the required data channel settings.
*/
get _getDataChannelSettings() {
return {
channels: {
// We use a single channel for text. To make things simpler, we
// always send on the publisher channel, and receive on the subscriber
// channel.
text: {}
}
};
},
/**
* Handles the setupStreamElements action. Saves the required data and
* kicks off the initialising of the publisher.
@ -108,7 +123,7 @@ loop.OTSdkDriver = (function() {
*/
_publishLocalStreams: function() {
this.publisher = this.sdk.initPublisher(this.getLocalElement(),
this._getCopyPublisherConfig());
_.extend(this._getDataChannelSettings, this._getCopyPublisherConfig));
this.publisher.on("streamCreated", this._onLocalStreamCreated.bind(this));
this.publisher.on("streamDestroyed", this._onLocalStreamDestroyed.bind(this));
this.publisher.on("accessAllowed", this._onPublishComplete.bind(this));
@ -165,7 +180,7 @@ loop.OTSdkDriver = (function() {
this._windowId = options.constraints.browserWindow;
}
var config = _.extend(this._getCopyPublisherConfig(), options);
var config = _.extend(this._getCopyPublisherConfig, options);
this.screenshare = this.sdk.initPublisher(this.getScreenShareElementFunc(),
config);
@ -241,6 +256,7 @@ loop.OTSdkDriver = (function() {
this.session.on("streamCreated", this._onRemoteStreamCreated.bind(this));
this.session.on("streamDestroyed", this._onRemoteStreamDestroyed.bind(this));
this.session.on("streamPropertyChanged", this._onStreamPropertyChanged.bind(this));
this.session.on("signal:readyForDataChannel", this._onReadyForDataChannel.bind(this));
// This starts the actual session connection.
this.session.connect(sessionData.apiKey, sessionData.sessionToken,
@ -495,7 +511,7 @@ loop.OTSdkDriver = (function() {
var remoteElement = this.getScreenShareElementFunc();
this.session.subscribe(stream,
remoteElement, this._getCopyPublisherConfig());
remoteElement, this._getCopyPublisherConfig);
},
/**
@ -522,8 +538,9 @@ loop.OTSdkDriver = (function() {
var remoteElement = this.getRemoteElement();
this.session.subscribe(event.stream,
remoteElement, this._getCopyPublisherConfig());
this.subscriber = this.session.subscribe(event.stream,
remoteElement, this._getCopyPublisherConfig,
this._onRemoteSessionSubscribed.bind(this, event.stream.connection));
this._subscribedRemoteStream = true;
if (this._checkAllStreamsConnected()) {
@ -532,6 +549,117 @@ loop.OTSdkDriver = (function() {
}
},
/**
* Once a remote stream has been subscribed to, this triggers the data
* channel set-up routines. A data channel cannot be requested before this
* time as the peer connection is not set up.
*
* @param {OT.Connection} connection The OT connection class object.
* @param {OT.Error} err Indicates if there's been an error in
* completing the subscribe.
*/
_onRemoteSessionSubscribed: function(connection, err) {
if (err) {
console.error(err);
return;
}
if (this._useDataChannels) {
this.session.signal({
type: "readyForDataChannel",
to: connection
}, function(signalError) {
if (signalError) {
console.error(signalError);
}
});
}
},
/**
* Handles receiving the signal that the other end of the connection
* has subscribed to the stream and we're ready to setup the data channel.
*
* We get data channels for both the publisher and subscriber on reception
* of the signal, as it means that a) the remote client is setup for data
* channels, and b) that subscribing of streams has definitely completed
* for both clients.
*
* @param {OT.SignalEvent} event Details of the signal received.
*/
_onReadyForDataChannel: function(event) {
// If we don't want data channels, just ignore the message. We haven't
// send the other side a message, so it won't display anything.
if (!this._useDataChannels) {
return;
}
// This won't work until a subscriber exists for this publisher
this.publisher._.getDataChannel("text", {}, function(err, channel) {
if (err) {
console.error(err);
return;
}
this._publisherChannel = channel;
channel.on({
close: function(event) {
// XXX We probably want to dispatch and handle this somehow.
console.log("Published data channel closed!");
}
});
this._checkDataChannelsAvailable();
}.bind(this));
this.subscriber._.getDataChannel("text", {}, function(err, channel) {
// Sends will queue until the channel is fully open.
if (err) {
console.error(err);
return;
}
channel.on({
message: function(event) {
try {
this.dispatcher.dispatch(
new sharedActions.ReceivedTextChatMessage(JSON.parse(event.data)));
} catch (ex) {
console.error("Failed to process incoming chat message", ex);
}
}.bind(this),
close: function(event) {
// XXX We probably want to dispatch and handle this somehow.
console.log("Subscribed data channel closed!");
}
});
this._subscriberChannel = channel;
this._checkDataChannelsAvailable();
}.bind(this));
},
/**
* Checks to see if all channels have been obtained, and if so it dispatches
* a notification to the stores to inform them.
*/
_checkDataChannelsAvailable: function() {
if (this._publisherChannel && this._subscriberChannel) {
this.dispatcher.dispatch(new sharedActions.DataChannelsAvailable());
}
},
/**
* Sends a text chat message on the data channel.
*
* @param {String} message The message to send.
*/
sendTextChatMessage: function(message) {
this._publisherChannel.send(JSON.stringify(message));
},
/**
* Handles the event when the local stream is created.
*
@ -792,8 +920,8 @@ loop.OTSdkDriver = (function() {
this._connectionLengthNotedCalls++;
if (this._debugTwoWayMediaTelemetry) {
console.log('Loop Telemetry: noted two-way media connection ' +
'in bucket: ', bucket);
console.log("Loop Telemetry: noted two-way media connection " +
"in bucket: ", bucket);
}
},

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

@ -0,0 +1,113 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
var loop = loop || {};
loop.store = loop.store || {};
loop.store.TextChatStore = (function() {
"use strict";
var sharedActions = loop.shared.actions;
var CHAT_MESSAGE_TYPES = loop.store.CHAT_MESSAGE_TYPES = {
RECEIVED: "recv",
SENT: "sent"
};
var CHAT_CONTENT_TYPES = loop.store.CHAT_CONTENT_TYPES = {
TEXT: "chat-text"
};
/**
* A store to handle text chats. The store has a message list that may
* contain different types of messages and data.
*/
var TextChatStore = loop.store.createStore({
actions: [
"dataChannelsAvailable",
"receivedTextChatMessage",
"sendTextChatMessage"
],
/**
* Initializes the store.
*
* @param {Object} options An object containing options for this store.
* It should consist of:
* - sdkDriver: The sdkDriver to use for sending
* messages.
*/
initialize: function(options) {
options = options || {};
if (!options.sdkDriver) {
throw new Error("Missing option sdkDriver");
}
this._sdkDriver = options.sdkDriver;
},
/**
* Returns initial state data for this active room.
*/
getInitialStoreState: function() {
return {
textChatEnabled: false,
// The messages currently received. Care should be taken when updating
// this - do not update the in-store array directly, but use a clone or
// separate array and then use setStoreState().
messageList: [],
length: 0
};
},
/**
* Handles information for when data channels are available - enables
* text chat.
*/
dataChannelsAvailable: function() {
this.setStoreState({ textChatEnabled: true });
},
/**
* Handles received text chat messages.
*
* @param {sharedActions.ReceivedTextChatMessage} actionData
*/
receivedTextChatMessage: function(actionData) {
// If we don't know how to deal with this content, then skip it
// as this version doesn't support it.
if (actionData.contentType != CHAT_CONTENT_TYPES.TEXT) {
return;
}
// We create a new list to avoid updating the store's state directly,
// which confuses the views.
var newList = this._storeState.messageList.concat({
type: CHAT_MESSAGE_TYPES.RECEIVED,
contentType: actionData.contentType,
message: actionData.message
});
this.setStoreState({ messageList: newList });
},
/**
* Handles sending of a chat message.
*
* @param {sharedActions.SendTextChatMessage} actionData
*/
sendTextChatMessage: function(actionData) {
// We create a new list to avoid updating the store's state directly,
// which confuses the views.
var newList = this._storeState.messageList.concat({
type: CHAT_MESSAGE_TYPES.SENT,
contentType: actionData.contentType,
message: actionData.message
});
this._sdkDriver.sendTextChatMessage(actionData);
this.setStoreState({ messageList: newList });
}
});
return TextChatStore;
})();

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

@ -0,0 +1,153 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
var loop = loop || {};
loop.shared = loop.shared || {};
loop.shared.views = loop.shared.views || {};
loop.shared.views.TextChatView = (function(mozl10n) {
var sharedActions = loop.shared.actions;
var CHAT_MESSAGE_TYPES = loop.store.CHAT_MESSAGE_TYPES;
var CHAT_CONTENT_TYPES = loop.store.CHAT_CONTENT_TYPES;
/**
* Renders an individual entry for the text chat entries view.
*/
var TextChatEntry = React.createClass({displayName: "TextChatEntry",
mixins: [React.addons.PureRenderMixin],
propTypes: {
message: React.PropTypes.string.isRequired,
type: React.PropTypes.string.isRequired
},
render: function() {
var classes = React.addons.classSet({
"text-chat-entry": true,
"received": this.props.type === CHAT_MESSAGE_TYPES.RECEIVED
});
return (
React.createElement("div", {className: classes},
this.props.message
)
);
}
});
/**
* Manages the text entries in the chat entries view. This is split out from
* TextChatView so that scrolling can be managed more efficiently - this
* component only updates when the message list is changed.
*/
var TextChatEntriesView = React.createClass({displayName: "TextChatEntriesView",
mixins: [React.addons.PureRenderMixin],
propTypes: {
messageList: React.PropTypes.array.isRequired
},
componentWillUpdate: function() {
var node = this.getDOMNode();
// Scroll only if we're right at the bottom of the display.
this.shouldScroll = node.scrollHeight === node.scrollTop + node.clientHeight;
},
componentDidUpdate: function() {
if (this.shouldScroll) {
// This ensures the paint is complete.
window.requestAnimationFrame(function() {
var node = this.getDOMNode();
node.scrollTop = node.scrollHeight - node.clientHeight;
}.bind(this));
}
},
render: function() {
return (
React.createElement("div", {className: "text-chat-entries"},
this.props.messageList.map(function(entry, i) {
return (
React.createElement(TextChatEntry, {key: i,
message: entry.message,
type: entry.type})
);
}, this)
)
);
}
});
/**
* Displays the text chat view. This includes the text chat messages as well
* as a field for entering new messages.
*/
var TextChatView = React.createClass({displayName: "TextChatView",
mixins: [
React.addons.LinkedStateMixin,
loop.store.StoreMixin("textChatStore")
],
propTypes: {
dispatcher: React.PropTypes.instanceOf(loop.Dispatcher).isRequired
},
getInitialState: function() {
return _.extend({
messageDetail: ""
}, this.getStoreState());
},
/**
* Handles a key being pressed - looking for the return key for submitting
* the form.
*
* @param {Object} event The DOM event.
*/
handleKeyDown: function(event) {
if (event.which === 13) {
this.handleFormSubmit(event);
}
},
/**
* Handles submitting of the form - dispatches a send text chat message.
*
* @param {Object} event The DOM event.
*/
handleFormSubmit: function(event) {
event.preventDefault();
this.props.dispatcher.dispatch(new sharedActions.SendTextChatMessage({
contentType: CHAT_CONTENT_TYPES.TEXT,
message: this.state.messageDetail
}));
// Reset the form to empty, ready for the next message.
this.setState({ messageDetail: "" });
},
render: function() {
if (!this.state.textChatEnabled) {
return null;
}
return (
React.createElement("div", {className: "text-chat-view"},
React.createElement(TextChatEntriesView, {messageList: this.state.messageList}),
React.createElement("div", {className: "text-chat-box"},
React.createElement("form", {onSubmit: this.handleFormSubmit},
React.createElement("input", {type: "text",
onKeyDown: this.handleKeyDown,
valueLink: this.linkState("messageDetail")})
)
)
)
);
}
});
return TextChatView;
})(navigator.mozL10n || document.mozL10n);

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

@ -0,0 +1,153 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
var loop = loop || {};
loop.shared = loop.shared || {};
loop.shared.views = loop.shared.views || {};
loop.shared.views.TextChatView = (function(mozl10n) {
var sharedActions = loop.shared.actions;
var CHAT_MESSAGE_TYPES = loop.store.CHAT_MESSAGE_TYPES;
var CHAT_CONTENT_TYPES = loop.store.CHAT_CONTENT_TYPES;
/**
* Renders an individual entry for the text chat entries view.
*/
var TextChatEntry = React.createClass({
mixins: [React.addons.PureRenderMixin],
propTypes: {
message: React.PropTypes.string.isRequired,
type: React.PropTypes.string.isRequired
},
render: function() {
var classes = React.addons.classSet({
"text-chat-entry": true,
"received": this.props.type === CHAT_MESSAGE_TYPES.RECEIVED
});
return (
<div className={classes}>
{this.props.message}
</div>
);
}
});
/**
* Manages the text entries in the chat entries view. This is split out from
* TextChatView so that scrolling can be managed more efficiently - this
* component only updates when the message list is changed.
*/
var TextChatEntriesView = React.createClass({
mixins: [React.addons.PureRenderMixin],
propTypes: {
messageList: React.PropTypes.array.isRequired
},
componentWillUpdate: function() {
var node = this.getDOMNode();
// Scroll only if we're right at the bottom of the display.
this.shouldScroll = node.scrollHeight === node.scrollTop + node.clientHeight;
},
componentDidUpdate: function() {
if (this.shouldScroll) {
// This ensures the paint is complete.
window.requestAnimationFrame(function() {
var node = this.getDOMNode();
node.scrollTop = node.scrollHeight - node.clientHeight;
}.bind(this));
}
},
render: function() {
return (
<div className="text-chat-entries">
{
this.props.messageList.map(function(entry, i) {
return (
<TextChatEntry key={i}
message={entry.message}
type={entry.type} />
);
}, this)
}
</div>
);
}
});
/**
* Displays the text chat view. This includes the text chat messages as well
* as a field for entering new messages.
*/
var TextChatView = React.createClass({
mixins: [
React.addons.LinkedStateMixin,
loop.store.StoreMixin("textChatStore")
],
propTypes: {
dispatcher: React.PropTypes.instanceOf(loop.Dispatcher).isRequired
},
getInitialState: function() {
return _.extend({
messageDetail: ""
}, this.getStoreState());
},
/**
* Handles a key being pressed - looking for the return key for submitting
* the form.
*
* @param {Object} event The DOM event.
*/
handleKeyDown: function(event) {
if (event.which === 13) {
this.handleFormSubmit(event);
}
},
/**
* Handles submitting of the form - dispatches a send text chat message.
*
* @param {Object} event The DOM event.
*/
handleFormSubmit: function(event) {
event.preventDefault();
this.props.dispatcher.dispatch(new sharedActions.SendTextChatMessage({
contentType: CHAT_CONTENT_TYPES.TEXT,
message: this.state.messageDetail
}));
// Reset the form to empty, ready for the next message.
this.setState({ messageDetail: "" });
},
render: function() {
if (!this.state.textChatEnabled) {
return null;
}
return (
<div className="text-chat-view">
<TextChatEntriesView messageList={this.state.messageList} />
<div className="text-chat-box">
<form onSubmit={this.handleFormSubmit}>
<input type="text"
onKeyDown={this.handleKeyDown}
valueLink={this.linkState("messageDetail")} />
</form>
</div>
</div>
);
}
});
return TextChatView;
})(navigator.mozL10n || document.mozL10n);

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

@ -11,6 +11,32 @@ var inChrome = typeof Components != "undefined" && "utils" in Components;
(function() {
"use strict";
/**
* Root object, by default set to window if we're not in chrome code.
* @type {DOMWindow|Object}
*/
var rootObject = inChrome ? {} : window;
/**
* Root navigator, by default set to navigator if we're not in chrome code.
* @type {Navigator|Object}
*/
var rootNavigator = inChrome ? {} : navigator;
/**
* Sets new root objects. This is useful for testing native DOM events, and also
* so we can easily stub items like navigator.mediaDevices.
* can fake them. In beforeEach(), loop.shared.utils.setRootObjects is used to
* substitute fake objects, and in afterEach(), the real window object is
* replaced.
*
* @param {Object} windowObj The fake window object, undefined to use window.
* @param {Object} navigatorObj The fake navigator object, undefined to use navigator.
*/
function setRootObjects(windowObj, navigatorObj) {
rootObject = windowObj || window;
rootNavigator = navigatorObj || navigator;
}
var mozL10n;
if (inChrome) {
this.EXPORTED_SYMBOLS = ["utils"];
@ -48,6 +74,7 @@ var inChrome = typeof Components != "undefined" && "utils" in Components;
var FAILURE_DETAILS = {
MEDIA_DENIED: "reason-media-denied",
NO_MEDIA: "reason-no-media",
UNABLE_TO_PUBLISH_MEDIA: "unable-to-publish-media",
COULD_NOT_CONNECT: "reason-could-not-connect",
NETWORK_DISCONNECTED: "reason-network-disconnected",
@ -109,8 +136,8 @@ var inChrome = typeof Components != "undefined" && "utils" in Components;
}
function isChrome(platform) {
return platform.toLowerCase().indexOf('chrome') > -1 ||
platform.toLowerCase().indexOf('chromium') > -1;
return platform.toLowerCase().indexOf("chrome") > -1 ||
platform.toLowerCase().indexOf("chromium") > -1;
}
function isFirefox(platform) {
@ -127,8 +154,8 @@ var inChrome = typeof Components != "undefined" && "utils" in Components;
}
function isOpera(platform) {
return platform.toLowerCase().indexOf('opera') > -1 ||
platform.toLowerCase().indexOf('opr') > -1;
return platform.toLowerCase().indexOf("opera") > -1 ||
platform.toLowerCase().indexOf("opr") > -1;
}
/**
@ -279,6 +306,40 @@ var inChrome = typeof Components != "undefined" && "utils" in Components;
return platform;
};
/**
* Determines if the user has any audio devices installed.
*
* @param {Function} callback Called with a boolean which is true if there
* are audio devices present.
*/
function hasAudioDevices(callback) {
// mediaDevices is the official API for the spec.
if ("mediaDevices" in rootNavigator) {
rootNavigator.mediaDevices.enumerateDevices().then(function(result) {
function checkForInput(device) {
return device.kind === "audioinput";
}
callback(result.some(checkForInput));
}).catch(function() {
callback(false);
});
// MediaStreamTrack is the older version of the API, implemented originally
// by Google Chrome.
} else if ("MediaStreamTrack" in rootObject) {
rootObject.MediaStreamTrack.getSources(function(result) {
function checkForInput(device) {
return device.kind === "audio";
}
callback(result.some(checkForInput));
});
} else {
// We don't know, so assume true.
callback(true);
}
}
/**
* Helper to allow getting some of the location data in a way that's compatible
* with stubbing for unit tests.
@ -671,6 +732,7 @@ var inChrome = typeof Components != "undefined" && "utils" in Components;
STREAM_PROPERTIES: STREAM_PROPERTIES,
SCREEN_SHARE_STATES: SCREEN_SHARE_STATES,
ROOM_INFO_FAILURES: ROOM_INFO_FAILURES,
setRootObjects: setRootObjects,
composeCallUrlEmail: composeCallUrlEmail,
formatDate: formatDate,
formatURL: formatURL,
@ -683,6 +745,7 @@ var inChrome = typeof Components != "undefined" && "utils" in Components;
isFirefoxOS: isFirefoxOS,
isOpera: isOpera,
getUnsupportedPlatform: getUnsupportedPlatform,
hasAudioDevices: hasAudioDevices,
locationData: locationData,
atob: atob,
btoa: btoa,

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

@ -84,6 +84,8 @@ browser.jar:
content/browser/loop/shared/js/otSdkDriver.js (content/shared/js/otSdkDriver.js)
content/browser/loop/shared/js/views.js (content/shared/js/views.js)
content/browser/loop/shared/js/feedbackViews.js (content/shared/js/feedbackViews.js)
content/browser/loop/shared/js/textChatStore.js (content/shared/js/textChatStore.js)
content/browser/loop/shared/js/textChatView.js (content/shared/js/textChatView.js)
content/browser/loop/shared/js/utils.js (content/shared/js/utils.js)
content/browser/loop/shared/js/validate.js (content/shared/js/validate.js)
content/browser/loop/shared/js/websocket.js (content/shared/js/websocket.js)

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

@ -146,7 +146,7 @@ CallProgressSocket.prototype = {
return;
}
if (msg.messageType && msg.messageType === 'hello') {
if (msg.messageType && msg.messageType === "hello") {
this._handshakeComplete = true;
this._onSuccess();
}

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

@ -267,7 +267,7 @@ const validateContact = function(obj, def = kContactFields) {
const batch = function(operation, data, callback) {
let processed = [];
if (!LoopContactsInternal.hasOwnProperty(operation) ||
typeof LoopContactsInternal[operation] != 'function') {
typeof LoopContactsInternal[operation] != "function") {
callback(new Error ("LoopContactsInternal does not contain a '" +
operation + "' method"));
return;

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

@ -20,7 +20,7 @@ XPCOMUtils.defineLazyGetter(this, "eventEmitter", function() {
return new EventEmitter();
});
XPCOMUtils.defineLazyGetter(this, "gLoopBundle", function() {
return Services.strings.createBundle('chrome://browser/locale/loop/loop.properties');
return Services.strings.createBundle("chrome://browser/locale/loop/loop.properties");
});
XPCOMUtils.defineLazyModuleGetter(this, "LoopRoomsCache",

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

@ -10,7 +10,7 @@ try {
Cu.importGlobalProperties(["indexedDB"]);
} catch (ex) {
// don't write this is out in xpcshell, since it's expected there
if (typeof window !== 'undefined' && "console" in window) {
if (typeof window !== "undefined" && "console" in window) {
console.log("Failed to import indexedDB; if this isn't a unit test," +
" something is wrong", ex);
}

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

@ -752,7 +752,7 @@ let MozLoopServiceInternal = {
stageForTelemetryUpload: function(window, pc) {
window.WebrtcGlobalInformation.getAllStats(allStats => {
let internalFormat = allStats.reports[0]; // filtered on pc.id
window.WebrtcGlobalInformation.getLogging('', logs => {
window.WebrtcGlobalInformation.getLogging("", logs => {
let report = convertToRTCStatsReport(internalFormat);
let logStr = "";
logs.forEach(s => { logStr += s + "\n"; });
@ -1072,6 +1072,7 @@ let gInitializeTimerFunc = (deferredInitialization) => {
MozLoopServiceInternal.initialRegistrationDelayMilliseconds);
};
let gServiceInitialized = false;
/**
* Public API
@ -1089,10 +1090,21 @@ this.MozLoopService = {
};
},
/**
* Used to override the initalize timer function for test purposes.
*/
set initializeTimerFunc(value) {
gInitializeTimerFunc = value;
},
/**
* Used to reset if the service has been initialized or not - for test
* purposes.
*/
resetServiceInitialized: function() {
gServiceInitialized = false;
},
get roomsParticipantsCount() {
return LoopRooms.participantsCount;
},
@ -1101,9 +1113,18 @@ this.MozLoopService = {
* Initialized the loop service, and starts registration with the
* push and loop servers.
*
* Note: this returns a promise for unit test purposes.
*
* @return {Promise}
*/
initialize: Task.async(function*() {
// Ensure we don't setup things like listeners more than once.
if (gServiceInitialized) {
return Promise.resolve();
}
gServiceInitialized = true;
// Do this here, rather than immediately after definition, so that we can
// stub out API functions for unit testing
Object.freeze(this);

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

@ -292,6 +292,30 @@ p.standalone-btn-label {
display: none;
}
/**
* The .text-chat-* styles are very temporarily whilst we work on text chat
* (bug 1108892 and dependencies).
*/
.text-chat-view {
height: 60px;
color: white;
}
.text-chat-entries {
/* XXX Should use flex, this is just for the initial implementation. */
height: calc(100% - 2em);
width: 30%;
}
.text-chat-box {
width: 30%;
margin: auto;
}
.text-chat-box > form > input {
width: 100%;
}
@media screen and (max-width:640px) {
.standalone .ended-conversation .feedback {
width: 92%;

Двоичные данные
browser/components/loop/standalone/content/favicon.ico Normal file

Двоичный файл не отображается.

После

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

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

@ -1,22 +1,25 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="102px" height="62px" viewBox="0 0 102 62" version="1.1" xmlns="http://www.w3.org/2000/svg">
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g transform="translate(0.500000, 0.000000)">
<rect stroke="#ABE6F8" fill="#FFFFFF" x="0.5" y="1" width="100" height="60"/>
<path d="M36.4003,3 L39.02,9.66666667 L34.8325,9.66666667 L5.6875,9.66666667 L1.5,9.66666667 L4.1197,3 L36.4003,3 Z" fill="#AAE5F9"/>
<rect fill="#AAE5F9" x="0.5" y="9" width="100" height="10"/>
<path d="M21.004515,11.3333333 C19.6213095,11.3333333 18.5,12.4429954 18.5,13.8333333 L18.5,13.8333333 C18.5,15.2140452 19.6250227,16.3333333 21.0055946,16.3333333 L40.8816964,16.3333333 L90.002759,16.3333333 C91.3819471,16.3333333 92.5,15.2236713 92.5,13.8333333 L92.5,13.8333333 C92.5,12.4526215 91.3819191,11.3333333 89.995485,11.3333333 L21.004515,11.3333333 Z" fill="#FFFFFF"/>
<rect stroke="#ABE6F8" x="0" y="0" width="101" height="62"/>
<g transform="translate(0.000000, 18.000000)">
<rect stroke="#92CB3E" stroke-width="2" fill="#FFFFFF" x="0.5" y="0" width="100" height="10"/>
<path d="M89.5096131,3 C88.3997344,3 87.5,3.88772964 87.5,5 L87.5,5 C87.5,6.1045695 88.3933569,7 89.4971942,7 L88.5360952,7 C89.6426425,7 91.4357226,7 92.5331547,7 L95.5533191,7 C96.6560555,7 97.55,6.11227036 97.55,5 L97.55,5 C97.55,3.8954305 96.6581295,3 95.5403869,3 L89.5096131,3 Z" stroke="#92CB3E" fill="#FFFFFF"/>
<path d="M78.5096131,3 C77.3997344,3 76.5,3.88772964 76.5,5 L76.5,5 C76.5,6.1045695 77.3933569,7 78.4971942,7 L77.5360952,7 C78.6426425,7 80.4357226,7 81.5331547,7 L84.5533191,7 C85.6560555,7 86.55,6.11227036 86.55,5 L86.55,5 C86.55,3.8954305 85.6581295,3 84.5403869,3 L78.5096131,3 Z" stroke="#92CB3E" fill="#FFFFFF"/>
<path d="M8.5,3.69642857 L8.5,6.73214286 C8.5,6.81026825 8.46372804,6.86514121 8.39118304,6.89676339 C8.36700137,6.90606403 8.34375011,6.91071429 8.32142857,6.91071429 C8.27120511,6.91071429 8.22935285,6.89304333 8.19587054,6.85770089 L7.07142857,5.73325893 L7.07142857,6.19642857 C7.07142857,6.41778384 6.99283933,6.60704907 6.83565848,6.76422991 C6.67847764,6.92141076 6.48921242,7 6.26785714,7 L4.30357143,7 C4.08221616,7 3.89295093,6.92141076 3.73577009,6.76422991 C3.57858924,6.60704907 3.5,6.41778384 3.5,6.19642857 L3.5,4.23214286 C3.5,4.01078758 3.57858924,3.82152236 3.73577009,3.66434152 C3.89295093,3.50716067 4.08221616,3.42857143 4.30357143,3.42857143 L6.26785714,3.42857143 C6.48921242,3.42857143 6.67847764,3.50716067 6.83565848,3.66434152 C6.99283933,3.82152236 7.07142857,4.01078758 7.07142857,4.23214286 L7.07142857,4.69252232 L8.19587054,3.57087054 C8.22935285,3.5355281 8.27120511,3.51785714 8.32142857,3.51785714 C8.34375011,3.51785714 8.36700137,3.52250739 8.39118304,3.53180804 C8.46372804,3.56343022 8.5,3.61830318 8.5,3.69642857 L8.5,3.69642857 Z" fill="#00AF84"/>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<svg width="102px" height="62px" viewBox="0 0 102 62" xmlns="http://www.w3.org/2000/svg">
<g stroke="none" fill="none" fill-rule="evenodd">
<g transform="translate(0.5,0)">
<rect stroke="#abe6f8" fill="#fff" x="0.5" y="1" width="100" height="60"/>
<path fill="#aae5f9" d="M36.4003,3 L39.02,9.66666667 L34.8325,9.66666667 L5.6875,9.66666667 L1.5,9.66666667 L4.1197,3 L36.4003,3 Z"/>
<rect fill="#aae5f9" x="0.5" y="9" width="100" height="10"/>
<path fill="#fff" d="M21.004515,11.3333333 C19.6213095,11.3333333 18.5,12.4429954 18.5,13.8333333 L18.5,13.8333333 C18.5,15.2140452 19.6250227,16.3333333 21.0055946,16.3333333 L40.8816964,16.3333333 L90.002759,16.3333333 C91.3819471,16.3333333 92.5,15.2236713 92.5,13.8333333 L92.5,13.8333333 C92.5,12.4526215 91.3819191,11.3333333 89.995485,11.3333333 L21.004515,11.3333333 Z"/>
<rect stroke="#abe6f8" width="101" height="62"/>
<g transform="translate(0,18)">
<rect stroke="#92cb3e" stroke-width="2" fill="#fff" x="0.5" width="100" height="10"/>
<path stroke="#92cb3e" fill="#fff" d="M89.5096131,3 C88.3997344,3 87.5,3.88772964 87.5,5 L87.5,5 C87.5,6.1045695 88.3933569,7 89.4971942,7 L88.5360952,7 C89.6426425,7 91.4357226,7 92.5331547,7 L95.5533191,7 C96.6560555,7 97.55,6.11227036 97.55,5 L97.55,5 C97.55,3.8954305 96.6581295,3 95.5403869,3 L89.5096131,3 Z"/>
<path stroke="#92cb3e" fill="#fff" d="M78.5096131,3 C77.3997344,3 76.5,3.88772964 76.5,5 L76.5,5 C76.5,6.1045695 77.3933569,7 78.4971942,7 L77.5360952,7 C78.6426425,7 80.4357226,7 81.5331547,7 L84.5533191,7 C85.6560555,7 86.55,6.11227036 86.55,5 L86.55,5 C86.55,3.8954305 85.6581295,3 84.5403869,3 L78.5096131,3 Z"/>
<path fill="#00af84" d="M8.5,3.69642857 L8.5,6.73214286 C8.5,6.81026825 8.46372804,6.86514121 8.39118304,6.89676339 C8.36700137,6.90606403 8.34375011,6.91071429 8.32142857,6.91071429 C8.27120511,6.91071429 8.22935285,6.89304333 8.19587054,6.85770089 L7.07142857,5.73325893 L7.07142857,6.19642857 C7.07142857,6.41778384 6.99283933,6.60704907 6.83565848,6.76422991 C6.67847764,6.92141076 6.48921242,7 6.26785714,7 L4.30357143,7 C4.08221616,7 3.89295093,6.92141076 3.73577009,6.76422991 C3.57858924,6.60704907 3.5,6.41778384 3.5,6.19642857 L3.5,4.23214286 C3.5,4.01078758 3.57858924,3.82152236 3.73577009,3.66434152 C3.89295093,3.50716067 4.08221616,3.42857143 4.30357143,3.42857143 L6.26785714,3.42857143 C6.48921242,3.42857143 6.67847764,3.50716067 6.83565848,3.66434152 C6.99283933,3.82152236 7.07142857,4.01078758 7.07142857,4.23214286 L7.07142857,4.69252232 L8.19587054,3.57087054 C8.22935285,3.5355281 8.27120511,3.51785714 8.32142857,3.51785714 C8.34375011,3.51785714 8.36700137,3.52250739 8.39118304,3.53180804 C8.46372804,3.56343022 8.5,3.61830318 8.5,3.69642857 L8.5,3.69642857 Z"/>
</g>
<path d="M97.9285714,14.5714286 L97.9285714,14.8571429 C97.9285714,14.8958335 97.9144347,14.9293153 97.8861607,14.9575893 C97.8578868,14.9858632 97.824405,15 97.7857143,15 L94.6428571,15 C94.6041665,15 94.5706847,14.9858632 94.5424107,14.9575893 C94.5141368,14.9293153 94.5,14.8958335 94.5,14.8571429 L94.5,14.5714286 C94.5,14.5327379 94.5141368,14.4992561 94.5424107,14.4709821 C94.5706847,14.4427082 94.6041665,14.4285714 94.6428571,14.4285714 L97.7857143,14.4285714 C97.824405,14.4285714 97.8578868,14.4427082 97.8861607,14.4709821 C97.9144347,14.4992561 97.9285714,14.5327379 97.9285714,14.5714286 L97.9285714,14.5714286 Z M97.9285714,13.4285714 L97.9285714,13.7142857 C97.9285714,13.7529764 97.9144347,13.7864582 97.8861607,13.8147321 C97.8578868,13.8430061 97.824405,13.8571429 97.7857143,13.8571429 L94.6428571,13.8571429 C94.6041665,13.8571429 94.5706847,13.8430061 94.5424107,13.8147321 C94.5141368,13.7864582 94.5,13.7529764 94.5,13.7142857 L94.5,13.4285714 C94.5,13.3898808 94.5141368,13.356399 94.5424107,13.328125 C94.5706847,13.299851 94.6041665,13.2857143 94.6428571,13.2857143 L97.7857143,13.2857143 C97.824405,13.2857143 97.8578868,13.299851 97.8861607,13.328125 C97.9144347,13.356399 97.9285714,13.3898808 97.9285714,13.4285714 L97.9285714,13.4285714 Z M97.9285714,12.2857143 L97.9285714,12.5714286 C97.9285714,12.6101192 97.9144347,12.643601 97.8861607,12.671875 C97.8578868,12.700149 97.824405,12.7142857 97.7857143,12.7142857 L94.6428571,12.7142857 C94.6041665,12.7142857 94.5706847,12.700149 94.5424107,12.671875 C94.5141368,12.643601 94.5,12.6101192 94.5,12.5714286 L94.5,12.2857143 C94.5,12.2470236 94.5141368,12.2135418 94.5424107,12.1852679 C94.5706847,12.1569939 94.6041665,12.1428571 94.6428571,12.1428571 L97.7857143,12.1428571 C97.824405,12.1428571 97.8578868,12.1569939 97.8861607,12.1852679 C97.9144347,12.2135418 97.9285714,12.2470236 97.9285714,12.2857143 L97.9285714,12.2857143 Z" fill="#FFFFFF"/>
<path d="M5.92857143,13.5714286 L5.92857143,13.8571429 C5.92857143,13.9360123 5.90439012,14.0033479 5.85602679,14.0591518 C5.80766345,14.1149556 5.74479205,14.1428571 5.66741071,14.1428571 L4.09598214,14.1428571 L4.75,14.7991071 C4.8065479,14.8526788 4.83482143,14.9196425 4.83482143,15 C4.83482143,15.0803575 4.8065479,15.1473212 4.75,15.2008929 L4.58258929,15.3705357 C4.52752949,15.4255955 4.46056587,15.453125 4.38169643,15.453125 C4.30431509,15.453125 4.23660743,15.4255955 4.17857143,15.3705357 L2.72544643,13.9151786 C2.67038663,13.8601188 2.64285714,13.7931552 2.64285714,13.7142857 C2.64285714,13.6369044 2.67038663,13.5691967 2.72544643,13.5111607 L4.17857143,12.0602679 C4.23511933,12.00372 4.30282699,11.9754464 4.38169643,11.9754464 C4.45907777,11.9754464 4.52604138,12.00372 4.58258929,12.0602679 L4.75,12.2254464 C4.8065479,12.2819943 4.83482143,12.349702 4.83482143,12.4285714 C4.83482143,12.5074409 4.8065479,12.5751485 4.75,12.6316964 L4.09598214,13.2857143 L5.66741071,13.2857143 C5.74479205,13.2857143 5.80766345,13.3136158 5.85602679,13.3694196 C5.90439012,13.4252235 5.92857143,13.4925591 5.92857143,13.5714286 L5.92857143,13.5714286 Z" fill="#FFFFFF"/>
<path d="M10.9285714,13.5714286 L10.9285714,13.8571429 C10.9285714,13.9360123 10.9043901,14.0033479 10.8560268,14.0591518 C10.8076634,14.1149556 10.7447921,14.1428571 10.6674107,14.1428571 L9.09598214,14.1428571 L9.75,14.7991071 C9.8065479,14.8526788 9.83482143,14.9196425 9.83482143,15 C9.83482143,15.0803575 9.8065479,15.1473212 9.75,15.2008929 L9.58258929,15.3705357 C9.52752949,15.4255955 9.46056587,15.453125 9.38169643,15.453125 C9.30431509,15.453125 9.23660743,15.4255955 9.17857143,15.3705357 L7.72544643,13.9151786 C7.67038663,13.8601188 7.64285714,13.7931552 7.64285714,13.7142857 C7.64285714,13.6369044 7.67038663,13.5691967 7.72544643,13.5111607 L9.17857143,12.0602679 C9.23511933,12.00372 9.30282699,11.9754464 9.38169643,11.9754464 C9.45907777,11.9754464 9.52604138,12.00372 9.58258929,12.0602679 L9.75,12.2254464 C9.8065479,12.2819943 9.83482143,12.349702 9.83482143,12.4285714 C9.83482143,12.5074409 9.8065479,12.5751485 9.75,12.6316964 L9.09598214,13.2857143 L10.6674107,13.2857143 C10.7447921,13.2857143 10.8076634,13.3136158 10.8560268,13.3694196 C10.9043901,13.4252235 10.9285714,13.4925591 10.9285714,13.5714286 L10.9285714,13.5714286 Z" fill="#FFFFFF" transform="translate(9.285714, 13.714286) scale(-1, 1) translate(-9.285714, -13.714286) "/>
<path d="M16.9285714,12.1428571 L16.9285714,13.1428571 C16.9285714,13.1815478 16.9144347,13.2150296 16.8861607,13.2433036 C16.8578868,13.2715775 16.824405,13.2857143 16.7857143,13.2857143 L15.7857143,13.2857143 C15.723214,13.2857143 15.6793156,13.2559527 15.6540179,13.1964286 C15.6287201,13.1383926 15.6391367,13.0870538 15.6852679,13.0424107 L15.9933036,12.734375 C15.7730644,12.5305049 15.5133944,12.4285714 15.2142857,12.4285714 C15.059523,12.4285714 14.9118311,12.4587051 14.7712054,12.5189732 C14.6305797,12.5792414 14.5089291,12.6607138 14.40625,12.7633929 C14.3035709,12.8660719 14.2220985,12.9877225 14.1618304,13.1283482 C14.1015622,13.2689739 14.0714286,13.4166659 14.0714286,13.5714286 C14.0714286,13.7261912 14.1015622,13.8738832 14.1618304,14.0145089 C14.2220985,14.1551346 14.3035709,14.2767852 14.40625,14.3794643 C14.5089291,14.4821434 14.6305797,14.5636158 14.7712054,14.6238839 C14.9118311,14.6841521 15.059523,14.7142857 15.2142857,14.7142857 C15.3913699,14.7142857 15.558779,14.6755956 15.7165179,14.5982143 C15.8742567,14.5208329 16.0074399,14.411459 16.1160714,14.2700893 C16.1264881,14.2552083 16.1436011,14.2462798 16.1674107,14.2433036 C16.1882442,14.2433036 16.2068452,14.2499999 16.2232143,14.2633929 L16.5290179,14.5714286 C16.5424108,14.5833334 16.5494792,14.5985862 16.5502232,14.6171875 C16.5509673,14.6357888 16.545387,14.6525297 16.5334821,14.6674107 C16.371279,14.8638403 16.1748523,15.0159965 15.9441964,15.1238839 C15.7135405,15.2317714 15.4702394,15.2857143 15.2142857,15.2857143 C14.9821417,15.2857143 14.7604177,15.2403278 14.5491071,15.1495536 C14.3377966,15.0587793 14.1555067,14.9367567 14.0022321,14.7834821 C13.8489576,14.6302076 13.726935,14.4479177 13.6361607,14.2366071 C13.5453865,14.0252966 13.5,13.8035726 13.5,13.5714286 C13.5,13.3392846 13.5453865,13.1175606 13.6361607,12.90625 C13.726935,12.6949394 13.8489576,12.5126496 14.0022321,12.359375 C14.1555067,12.2061004 14.3377966,12.0840778 14.5491071,11.9933036 C14.7604177,11.9025293 14.9821417,11.8571429 15.2142857,11.8571429 C15.4330368,11.8571429 15.6447162,11.8984371 15.8493304,11.9810268 C16.0539445,12.0636165 16.2358623,12.1800588 16.3950893,12.3303571 L16.6852679,12.0424107 C16.7284228,11.9962795 16.7805056,11.985863 16.8415179,12.0111607 C16.8995539,12.0364585 16.9285714,12.0803568 16.9285714,12.1428571 L16.9285714,12.1428571 Z" fill="#FFFFFF"/>
<path fill="#fff" d="M97.9285714,14.5714286 L97.9285714,14.8571429 C97.9285714,14.8958335 97.9144347,14.9293153 97.8861607,14.9575893 C97.8578868,14.9858632 97.824405,15 97.7857143,15 L94.6428571,15 C94.6041665,15 94.5706847,14.9858632 94.5424107,14.9575893 C94.5141368,14.9293153 94.5,14.8958335 94.5,14.8571429 L94.5,14.5714286 C94.5,14.5327379 94.5141368,14.4992561 94.5424107,14.4709821 C94.5706847,14.4427082 94.6041665,14.4285714 94.6428571,14.4285714 L97.7857143,14.4285714 C97.824405,14.4285714 97.8578868,14.4427082 97.8861607,14.4709821 C97.9144347,14.4992561 97.9285714,14.5327379 97.9285714,14.5714286 L97.9285714,14.5714286 Z M97.9285714,13.4285714 L97.9285714,13.7142857 C97.9285714,13.7529764 97.9144347,13.7864582 97.8861607,13.8147321 C97.8578868,13.8430061 97.824405,13.8571429 97.7857143,13.8571429 L94.6428571,13.8571429 C94.6041665,13.8571429 94.5706847,13.8430061 94.5424107,13.8147321 C94.5141368,13.7864582 94.5,13.7529764 94.5,13.7142857 L94.5,13.4285714 C94.5,13.3898808 94.5141368,13.356399 94.5424107,13.328125 C94.5706847,13.299851 94.6041665,13.2857143 94.6428571,13.2857143 L97.7857143,13.2857143 C97.824405,13.2857143 97.8578868,13.299851 97.8861607,13.328125 C97.9144347,13.356399 97.9285714,13.3898808 97.9285714,13.4285714 L97.9285714,13.4285714 Z M97.9285714,12.2857143 L97.9285714,12.5714286 C97.9285714,12.6101192 97.9144347,12.643601 97.8861607,12.671875 C97.8578868,12.700149 97.824405,12.7142857 97.7857143,12.7142857 L94.6428571,12.7142857 C94.6041665,12.7142857 94.5706847,12.700149 94.5424107,12.671875 C94.5141368,12.643601 94.5,12.6101192 94.5,12.5714286 L94.5,12.2857143 C94.5,12.2470236 94.5141368,12.2135418 94.5424107,12.1852679 C94.5706847,12.1569939 94.6041665,12.1428571 94.6428571,12.1428571 L97.7857143,12.1428571 C97.824405,12.1428571 97.8578868,12.1569939 97.8861607,12.1852679 C97.9144347,12.2135418 97.9285714,12.2470236 97.9285714,12.2857143 L97.9285714,12.2857143 Z"/>
<path fill="#fff" d="M5.92857143,13.5714286 L5.92857143,13.8571429 C5.92857143,13.9360123 5.90439012,14.0033479 5.85602679,14.0591518 C5.80766345,14.1149556 5.74479205,14.1428571 5.66741071,14.1428571 L4.09598214,14.1428571 L4.75,14.7991071 C4.8065479,14.8526788 4.83482143,14.9196425 4.83482143,15 C4.83482143,15.0803575 4.8065479,15.1473212 4.75,15.2008929 L4.58258929,15.3705357 C4.52752949,15.4255955 4.46056587,15.453125 4.38169643,15.453125 C4.30431509,15.453125 4.23660743,15.4255955 4.17857143,15.3705357 L2.72544643,13.9151786 C2.67038663,13.8601188 2.64285714,13.7931552 2.64285714,13.7142857 C2.64285714,13.6369044 2.67038663,13.5691967 2.72544643,13.5111607 L4.17857143,12.0602679 C4.23511933,12.00372 4.30282699,11.9754464 4.38169643,11.9754464 C4.45907777,11.9754464 4.52604138,12.00372 4.58258929,12.0602679 L4.75,12.2254464 C4.8065479,12.2819943 4.83482143,12.349702 4.83482143,12.4285714 C4.83482143,12.5074409 4.8065479,12.5751485 4.75,12.6316964 L4.09598214,13.2857143 L5.66741071,13.2857143 C5.74479205,13.2857143 5.80766345,13.3136158 5.85602679,13.3694196 C5.90439012,13.4252235 5.92857143,13.4925591 5.92857143,13.5714286 L5.92857143,13.5714286 Z"/>
<path fill="#fff" d="M10.9285714,13.5714286 L10.9285714,13.8571429 C10.9285714,13.9360123 10.9043901,14.0033479 10.8560268,14.0591518 C10.8076634,14.1149556 10.7447921,14.1428571 10.6674107,14.1428571 L9.09598214,14.1428571 L9.75,14.7991071 C9.8065479,14.8526788 9.83482143,14.9196425 9.83482143,15 C9.83482143,15.0803575 9.8065479,15.1473212 9.75,15.2008929 L9.58258929,15.3705357 C9.52752949,15.4255955 9.46056587,15.453125 9.38169643,15.453125 C9.30431509,15.453125 9.23660743,15.4255955 9.17857143,15.3705357 L7.72544643,13.9151786 C7.67038663,13.8601188 7.64285714,13.7931552 7.64285714,13.7142857 C7.64285714,13.6369044 7.67038663,13.5691967 7.72544643,13.5111607 L9.17857143,12.0602679 C9.23511933,12.00372 9.30282699,11.9754464 9.38169643,11.9754464 C9.45907777,11.9754464 9.52604138,12.00372 9.58258929,12.0602679 L9.75,12.2254464 C9.8065479,12.2819943 9.83482143,12.349702 9.83482143,12.4285714 C9.83482143,12.5074409 9.8065479,12.5751485 9.75,12.6316964 L9.09598214,13.2857143 L10.6674107,13.2857143 C10.7447921,13.2857143 10.8076634,13.3136158 10.8560268,13.3694196 C10.9043901,13.4252235 10.9285714,13.4925591 10.9285714,13.5714286 L10.9285714,13.5714286 Z" transform="translate(9.285714, 13.714286) scale(-1, 1) translate(-9.285714, -13.714286) "/>
<path fill="#fff" d="M16.9285714,12.1428571 L16.9285714,13.1428571 C16.9285714,13.1815478 16.9144347,13.2150296 16.8861607,13.2433036 C16.8578868,13.2715775 16.824405,13.2857143 16.7857143,13.2857143 L15.7857143,13.2857143 C15.723214,13.2857143 15.6793156,13.2559527 15.6540179,13.1964286 C15.6287201,13.1383926 15.6391367,13.0870538 15.6852679,13.0424107 L15.9933036,12.734375 C15.7730644,12.5305049 15.5133944,12.4285714 15.2142857,12.4285714 C15.059523,12.4285714 14.9118311,12.4587051 14.7712054,12.5189732 C14.6305797,12.5792414 14.5089291,12.6607138 14.40625,12.7633929 C14.3035709,12.8660719 14.2220985,12.9877225 14.1618304,13.1283482 C14.1015622,13.2689739 14.0714286,13.4166659 14.0714286,13.5714286 C14.0714286,13.7261912 14.1015622,13.8738832 14.1618304,14.0145089 C14.2220985,14.1551346 14.3035709,14.2767852 14.40625,14.3794643 C14.5089291,14.4821434 14.6305797,14.5636158 14.7712054,14.6238839 C14.9118311,14.6841521 15.059523,14.7142857 15.2142857,14.7142857 C15.3913699,14.7142857 15.558779,14.6755956 15.7165179,14.5982143 C15.8742567,14.5208329 16.0074399,14.411459 16.1160714,14.2700893 C16.1264881,14.2552083 16.1436011,14.2462798 16.1674107,14.2433036 C16.1882442,14.2433036 16.2068452,14.2499999 16.2232143,14.2633929 L16.5290179,14.5714286 C16.5424108,14.5833334 16.5494792,14.5985862 16.5502232,14.6171875 C16.5509673,14.6357888 16.545387,14.6525297 16.5334821,14.6674107 C16.371279,14.8638403 16.1748523,15.0159965 15.9441964,15.1238839 C15.7135405,15.2317714 15.4702394,15.2857143 15.2142857,15.2857143 C14.9821417,15.2857143 14.7604177,15.2403278 14.5491071,15.1495536 C14.3377966,15.0587793 14.1555067,14.9367567 14.0022321,14.7834821 C13.8489576,14.6302076 13.726935,14.4479177 13.6361607,14.2366071 C13.5453865,14.0252966 13.5,13.8035726 13.5,13.5714286 C13.5,13.3392846 13.5453865,13.1175606 13.6361607,12.90625 C13.726935,12.6949394 13.8489576,12.5126496 14.0022321,12.359375 C14.1555067,12.2061004 14.3377966,12.0840778 14.5491071,11.9933036 C14.7604177,11.9025293 14.9821417,11.8571429 15.2142857,11.8571429 C15.4330368,11.8571429 15.6447162,11.8984371 15.8493304,11.9810268 C16.0539445,12.0636165 16.2358623,12.1800588 16.3950893,12.3303571 L16.6852679,12.0424107 C16.7284228,11.9962795 16.7805056,11.985863 16.8415179,12.0111607 C16.8995539,12.0364585 16.9285714,12.0803568 16.9285714,12.1428571 L16.9285714,12.1428571 Z"/>
</g>
</g>
</svg>

До

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

После

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

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше