2012-07-11 18:31:19 -07:00
/ * T h i s S o u r c e C o d e F o r m i s s u b j e c t t o t h e t e r m s o f t h e M o z i l l a P u b l i c
* 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/. */
let prefName = "social.enabled" ,
2012-08-08 18:09:37 -07:00
gFinishCB ;
2012-07-11 18:31:19 -07:00
function test ( ) {
waitForExplicitFinish ( ) ;
// Need to load a non-empty page for the social share button to appear
let tab = gBrowser . selectedTab = gBrowser . addTab ( "about:" , { skipAnimation : true } ) ;
tab . linkedBrowser . addEventListener ( "load" , function tabLoad ( event ) {
tab . linkedBrowser . removeEventListener ( "load" , tabLoad , true ) ;
executeSoon ( tabLoaded ) ;
} , true ) ;
registerCleanupFunction ( function ( ) {
2012-08-11 20:55:58 -07:00
Services . prefs . clearUserPref ( prefName ) ;
2012-07-11 18:31:19 -07:00
gBrowser . removeTab ( tab ) ;
} ) ;
}
function tabLoaded ( ) {
ok ( Social , "Social module loaded" ) ;
2012-08-08 18:09:37 -07:00
let manifest = { // normal provider
name : "provider 1" ,
origin : "https://example.com" ,
sidebarURL : "https://example.com/browser/browser/base/content/test/social_sidebar.html" ,
workerURL : "https://example.com/browser/browser/base/content/test/social_worker.js" ,
iconURL : "chrome://branding/content/icon48.png"
} ;
runSocialTestWithProvider ( manifest , function ( finishcb ) {
gFinishCB = finishcb ;
testInitial ( ) ;
} ) ;
2012-07-11 18:31:19 -07:00
}
2012-08-08 18:09:37 -07:00
function testInitial ( finishcb ) {
2012-07-11 18:31:19 -07:00
ok ( Social . provider , "Social provider is active" ) ;
ok ( Social . provider . enabled , "Social provider is enabled" ) ;
2012-09-11 19:48:38 -07:00
let port = Social . provider . getWorkerPort ( ) ;
ok ( port , "Social provider has a port to its FrameWorker" ) ;
port . close ( ) ;
2012-07-11 18:31:19 -07:00
2012-08-24 20:11:55 -07:00
let { shareButton , sharePopup } = SocialShareButton ;
2012-07-11 18:31:19 -07:00
ok ( shareButton , "share button exists" ) ;
ok ( sharePopup , "share popup exists" ) ;
2012-08-24 20:11:55 -07:00
let okButton = document . getElementById ( "editSharePopupOkButton" ) ;
let undoButton = document . getElementById ( "editSharePopupUndoButton" ) ;
2012-08-27 04:16:38 -07:00
let shareStatusLabel = document . getElementById ( "share-button-status" ) ;
2012-08-24 20:11:55 -07:00
// ensure the worker initialization and handshakes are all done and we
2012-08-27 04:16:38 -07:00
// have a profile and the worker has responsed to the recommend-prompt msg.
waitForCondition ( function ( ) Social . provider . profile && SocialShareButton . promptImages != null , function ( ) {
is ( shareButton . hasAttribute ( "shared" ) , false , "Share button should not have 'shared' attribute before share button is clicked" ) ;
2012-08-24 20:11:55 -07:00
// check dom values
let profile = Social . provider . profile ;
let portrait = document . getElementById ( "socialUserPortrait" ) . getAttribute ( "src" ) ;
is ( profile . portrait , portrait , "portrait is set" ) ;
let displayName = document . getElementById ( "socialUserDisplayName" ) ;
is ( displayName . label , profile . displayName , "display name is set" ) ;
ok ( ! document . getElementById ( "editSharePopupHeader" ) . hidden , "user profile is visible" ) ;
2012-08-27 04:16:38 -07:00
// Check the strings from our worker actually ended up on the button.
is ( shareButton . getAttribute ( "tooltiptext" ) , "Share this page" , "check tooltip text is correct" ) ;
is ( shareStatusLabel . getAttribute ( "value" ) , "" , "check status label text is blank" ) ;
// Check the relative URL was resolved correctly (note this image has offsets of zero...)
is ( shareButton . style . backgroundImage , 'url("https://example.com/browser/browser/base/content/test/social_share_image.png")' , "check image url is correct" ) ;
2012-08-24 20:11:55 -07:00
// Test clicking the share button
shareButton . addEventListener ( "click" , function listener ( ) {
shareButton . removeEventListener ( "click" , listener ) ;
is ( shareButton . hasAttribute ( "shared" ) , true , "Share button should have 'shared' attribute after share button is clicked" ) ;
2012-08-27 04:16:38 -07:00
is ( shareButton . getAttribute ( "tooltiptext" ) , "Unshare this page" , "check tooltip text is correct" ) ;
is ( shareStatusLabel . getAttribute ( "value" ) , "This page has been shared" , "check status label text is correct" ) ;
// Check the URL and offsets were applied correctly
is ( shareButton . style . backgroundImage , 'url("https://example.com/browser/browser/base/content/test/social_share_image.png")' , "check image url is correct" ) ;
2012-08-24 20:11:55 -07:00
executeSoon ( testSecondClick . bind ( window , testPopupOKButton ) ) ;
} ) ;
EventUtils . synthesizeMouseAtCenter ( shareButton , { } ) ;
2012-08-27 04:16:38 -07:00
} , "provider didn't provide user-recommend-prompt response" ) ;
2012-07-11 18:31:19 -07:00
}
function testSecondClick ( nextTest ) {
2012-08-24 20:11:55 -07:00
let { shareButton , sharePopup } = SocialShareButton ;
2012-07-11 18:31:19 -07:00
sharePopup . addEventListener ( "popupshown" , function listener ( ) {
sharePopup . removeEventListener ( "popupshown" , listener ) ;
ok ( true , "popup was shown after second click" ) ;
executeSoon ( nextTest ) ;
} ) ;
EventUtils . synthesizeMouseAtCenter ( shareButton , { } ) ;
}
function testPopupOKButton ( ) {
2012-08-24 20:11:55 -07:00
let { shareButton , sharePopup } = SocialShareButton ;
let okButton = document . getElementById ( "editSharePopupOkButton" ) ;
2012-07-11 18:31:19 -07:00
sharePopup . addEventListener ( "popuphidden" , function listener ( ) {
sharePopup . removeEventListener ( "popuphidden" , listener ) ;
is ( shareButton . hasAttribute ( "shared" ) , true , "Share button should still have 'shared' attribute after OK button is clicked" ) ;
executeSoon ( testSecondClick . bind ( window , testPopupUndoButton ) ) ;
} ) ;
EventUtils . synthesizeMouseAtCenter ( okButton , { } ) ;
}
function testPopupUndoButton ( ) {
2012-08-24 20:11:55 -07:00
let { shareButton , sharePopup } = SocialShareButton ;
let undoButton = document . getElementById ( "editSharePopupUndoButton" ) ;
2012-07-11 18:31:19 -07:00
sharePopup . addEventListener ( "popuphidden" , function listener ( ) {
sharePopup . removeEventListener ( "popuphidden" , listener ) ;
is ( shareButton . hasAttribute ( "shared" ) , false , "Share button should not have 'shared' attribute after Undo button is clicked" ) ;
executeSoon ( testShortcut ) ;
} ) ;
EventUtils . synthesizeMouseAtCenter ( undoButton , { } ) ;
}
function testShortcut ( ) {
let keyTarget = window ;
keyTarget . addEventListener ( "keyup" , function listener ( ) {
keyTarget . removeEventListener ( "keyup" , listener ) ;
executeSoon ( checkShortcutWorked . bind ( window , keyTarget ) ) ;
} ) ;
EventUtils . synthesizeKey ( "l" , { accelKey : true , shiftKey : true } , keyTarget ) ;
}
function checkShortcutWorked ( keyTarget ) {
2012-08-24 20:11:55 -07:00
let { sharePopup , shareButton } = SocialShareButton ;
2012-07-11 18:31:19 -07:00
is ( shareButton . hasAttribute ( "shared" ) , true , "Share button should be in the 'shared' state after keyboard shortcut is used" ) ;
// Test a second invocation of the shortcut
sharePopup . addEventListener ( "popupshown" , function listener ( ) {
sharePopup . removeEventListener ( "popupshown" , listener ) ;
ok ( true , "popup was shown after second use of keyboard shortcut" ) ;
executeSoon ( checkOKButton ) ;
} ) ;
EventUtils . synthesizeKey ( "l" , { accelKey : true , shiftKey : true } , keyTarget ) ;
}
function checkOKButton ( ) {
2012-08-24 20:11:55 -07:00
let okButton = document . getElementById ( "editSharePopupOkButton" ) ;
let undoButton = document . getElementById ( "editSharePopupUndoButton" ) ;
2012-07-11 18:31:19 -07:00
is ( document . activeElement , okButton , "ok button should be focused by default" ) ;
2012-08-08 18:09:37 -07:00
// This rest of particular test doesn't really apply on Mac, since buttons
// aren't focusable by default.
2012-09-08 13:58:23 -07:00
if ( navigator . platform . contains ( "Mac" ) ) {
2012-08-08 18:09:37 -07:00
executeSoon ( testCloseBySpace ) ;
2012-07-11 18:31:19 -07:00
return ;
}
2012-08-08 18:09:37 -07:00
let displayName = document . getElementById ( "socialUserDisplayName" ) ;
// Linux has the buttons in the [unshare] [ok] order, so displayName will come first.
2012-09-08 13:58:23 -07:00
if ( navigator . platform . contains ( "Linux" ) ) {
2012-08-08 18:09:37 -07:00
checkNextInTabOrder ( displayName , function ( ) {
checkNextInTabOrder ( undoButton , function ( ) {
checkNextInTabOrder ( okButton , testCloseBySpace ) ;
} ) ;
} ) ;
} else {
checkNextInTabOrder ( undoButton , function ( ) {
checkNextInTabOrder ( displayName , function ( ) {
checkNextInTabOrder ( okButton , testCloseBySpace ) ;
} ) ;
} ) ;
}
}
function checkNextInTabOrder ( element , next ) {
2012-07-11 18:31:19 -07:00
function listener ( ) {
element . removeEventListener ( "focus" , listener ) ;
is ( document . activeElement , element , element . id + " should be next in tab order" ) ;
executeSoon ( next ) ;
}
element . addEventListener ( "focus" , listener ) ;
// Register a cleanup function to remove the listener in case this test fails
registerCleanupFunction ( function ( ) {
element . removeEventListener ( "focus" , listener ) ;
} ) ;
EventUtils . synthesizeKey ( "VK_TAB" , { } ) ;
}
function testCloseBySpace ( ) {
2012-08-24 20:11:55 -07:00
let sharePopup = SocialShareButton . sharePopup ;
is ( document . activeElement . id , "editSharePopupOkButton" , "testCloseBySpace, the ok button should be focused" ) ;
2012-07-11 18:31:19 -07:00
sharePopup . addEventListener ( "popuphidden" , function listener ( ) {
sharePopup . removeEventListener ( "popuphidden" , listener ) ;
ok ( true , "space closed the share popup" ) ;
executeSoon ( testDisable ) ;
} ) ;
EventUtils . synthesizeKey ( "VK_SPACE" , { } ) ;
}
function testDisable ( ) {
2012-08-24 20:11:55 -07:00
let shareButton = SocialShareButton . shareButton ;
2012-07-11 18:31:19 -07:00
Services . prefs . setBoolPref ( prefName , false ) ;
is ( shareButton . hidden , true , "Share button should be hidden when pref is disabled" ) ;
2012-08-08 18:09:37 -07:00
gFinishCB ( ) ;
2012-07-11 18:31:19 -07:00
}