package org.limewire.ui.swing.friends.login; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.event.ActionEvent; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingUtilities; import org.jdesktop.application.Resource; import org.limewire.concurrent.FutureEvent; import org.limewire.core.api.Application; import org.limewire.friend.api.FriendConnectionFactory; import org.limewire.listener.EventListener; import org.limewire.listener.SwingEDTEvent; import org.limewire.ui.swing.action.AbstractAction; import org.limewire.ui.swing.browser.Browser; import org.limewire.ui.swing.browser.LimeDomListener; import org.limewire.ui.swing.browser.UriAction; import org.limewire.ui.swing.components.HyperlinkButton; import org.limewire.ui.swing.friends.settings.FacebookFriendAccountConfiguration; import org.limewire.ui.swing.util.GuiUtils; import org.limewire.ui.swing.util.I18n; import org.limewire.ui.swing.util.NativeLaunchUtils; import org.mozilla.browser.MozillaAutomation; import org.mozilla.browser.MozillaPanel.VisibilityMode; import org.mozilla.browser.XPCOMUtils; import org.mozilla.browser.impl.ChromeAdapter; import org.mozilla.interfaces.nsIDOMEvent; import org.mozilla.interfaces.nsIDOMEventListener; import org.mozilla.interfaces.nsIDOMEventTarget; import org.mozilla.interfaces.nsIDOMWindow2; import org.mozilla.interfaces.nsISupports; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; import net.miginfocom.swing.MigLayout; public class FacebookLoginAction extends AbstractAction { @Resource private Font goBackFont; @Resource private Color goBackBackground; private final FacebookFriendAccountConfiguration config; private final FriendConnectionFactory friendConnectionFactory; private final LoginPopupPanel loginPanel; private final Application application; @Inject public FacebookLoginAction(@Assisted FacebookFriendAccountConfiguration config, FriendConnectionFactory friendConnectionFactory, LoginPopupPanel loginPanel, Application application) { super(config.getLabel(), config.getLargeIcon()); putValue(ServiceSelectionLoginPanel.CONFIG, config); GuiUtils.assignResources(this); this.config = config; this.friendConnectionFactory = friendConnectionFactory; this.loginPanel = loginPanel; this.application = application; } @Override public void actionPerformed(ActionEvent e) { final Browser browser = new Browser(VisibilityMode.FORCED_HIDDEN, VisibilityMode.FORCED_HIDDEN, VisibilityMode.DEFAULT) { @Override public void onAttachBrowser(ChromeAdapter chromeAdapter, ChromeAdapter parentChromeAdapter) { super.onAttachBrowser(chromeAdapter, parentChromeAdapter); nsIDOMEventTarget eventTarget = XPCOMUtils.qi(chromeAdapter.getWebBrowser().getContentDOMWindow(), nsIDOMWindow2.class).getWindowRoot(); LimeDomListener limeDomListener = new LimeDomListener(); limeDomListener.addTargetedUrlAction("", new UriAction() { @Override public boolean uriClicked(TargetedUri targetedUri) { NativeLaunchUtils.openURL(targetedUri.getUri()); return true; } }); eventTarget.addEventListener("click", limeDomListener, true); eventTarget.addEventListener("load", new nsIDOMEventListener() { @Override public void handleEvent(nsIDOMEvent event) { String url = getUrl(); if (url.contains("desktopapp.php")) { config.loadCookies(); friendConnectionFactory.login(config); SwingUtilities.invokeLater(new Runnable() { public void run() { loginPanel.finished(); } }); } else if (url.contains("login")) { String script = "(function() {" + " function addHiddenInput(name, value) {" + " var input = document.createElement('input'); input.type='hidden'; input.name=name; input.value=value; document.forms[0].appendChild(input);" + " }" + " addHiddenInput('persistent', '1');" + " addHiddenInput('visibility', 'true');" + "})();"; jsexec(script); if(config.isAutologin()) { script = "(function() {" + " function checkStayLoggedIn(offline_checkbox) {" + " offline_checkbox.checked = 1;" + " }" + " checkStayLoggedIn(document.getElementById('offline_access'));" + "})();"; jsexec(script); } } } @Override public nsISupports queryInterface(String uuid) { return null; } }, true); } }; JPanel facebookLoginPanel = new JPanel(); facebookLoginPanel.setLayout(new BorderLayout()); facebookLoginPanel.add(browser, BorderLayout.CENTER); HyperlinkButton goBackLink = new HyperlinkButton(new AbstractAction(I18n.tr("Choose another account")) { @Override public void actionPerformed(ActionEvent e) { loginPanel.restart(); } }); goBackLink.setFont(goBackFont); JPanel goBackPanel = new JPanel(new MigLayout("insets 0 0 2 0, gap 0, fill")); goBackPanel.setBackground(goBackBackground); goBackPanel.add(goBackLink, "align center"); goBackPanel.setBorder(BorderFactory.createMatteBorder(1,0,0,0, new Color(0xa4a4a4))); facebookLoginPanel.add(goBackPanel, BorderLayout.SOUTH); loginPanel.setLoginComponent(facebookLoginPanel); MozillaAutomation.blockingLoad(browser, "about:blank"); // show a loading panel (but not immediately -- the blocking load finishing may hide it) SwingUtilities.invokeLater(new Runnable() { @Override public void run() { browser.showLoadingPanel(); } }); friendConnectionFactory.requestLoginUrl(config).addFutureListener(new EventListener<FutureEvent<String>>() { @Override @SwingEDTEvent public void handleEvent(FutureEvent<String> event) { switch (event.getType()) { case SUCCESS: browser.load(event.getResult()); break; case EXCEPTION: browser.load(application.addClientInfoToUrl("http://client-data.limewire.com/fberror/")); break; default: throw new IllegalStateException(event.getType().toString()); } } }); } }