+ currentChannel.registerMessage(
+ 'pageLoaded', this.onPageLoaded_.bind(this, tabId));
+
+ this.channelInjected_[this.getTabIdFromPort_(port)] = currentChannel;
+ },
+
+ getTabIdFromPort_: function(port) {
+ return port.sender.tab ? port.sender.tab.id : -1;
+ },
+
+ /**
+ * Handler for 'initDesktopFlow' signal sent from the main script.
+ * Only called in desktop mode.
+ */
+ onInitDesktopFlow_: function(msg) {
+ this.gaiaUrl_ = msg.gaiaUrl;
+ this.continueUrl_ = msg.continueUrl;
+ this.isConstrainedWindow_ = msg.isConstrainedWindow;
+
+ var urls = [];
+ var filter = {urls: urls, types: ['sub_frame']};
+ var optExtraInfoSpec = [];
+ if (msg.isConstrainedWindow) {
+ urls.push('<all_urls>');
+ optExtraInfoSpec.push('responseHeaders');
+ } else {
+ urls.push(this.continueUrl_ + '*');
+ }
+
+ chrome.webRequest.onCompleted.addListener(
+ this.onRequestCompletedInDesktopMode_.bind(this),
+ filter, optExtraInfoSpec);
+ chrome.webRequest.onHeadersReceived.addListener(
+ this.onHeadersReceivedInDesktopMode_.bind(this),
+ {urls: [this.gaiaUrl_ + '*'], types: ['sub_frame']},
+ ['responseHeaders']);
+ },
+
+ /**
+ * Event listener for webRequest.onCompleted in desktop mode.
+ */
+ onRequestCompletedInDesktopMode_: function(details) {
+ var msg = null;
+ if (details.url.lastIndexOf(this.continueUrl_, 0) == 0) {
+ var skipForNow = false;
+ if (details.url.indexOf('ntp=1') >= 0) {
+ skipForNow = true;
+ }
+ msg = {
+ 'name': 'completeLogin',
+ 'email': this.email_,
+ 'sessionIndex': this.sessionIndex_,
+ 'skipForNow': skipForNow
+ };
+ } else if (this.isConstrainedWindow_) {
+ var headers = details.responseHeaders;
+ for (var i = 0; headers && i < headers.length; ++i) {
+ if (headers[i].name.toLowerCase() == 'google-accounts-embedded') {
+ return;
+ }
+ }
+ msg = {
+ 'name': 'switchToFullTab',
+ 'url': details.url
+ };
+ }
+
+ if (msg != null)
+ this.channelMain_[details.tabId].send(msg);
+ },
+
+ /**
+ * Event listener for webRequest.onHeadersReceived in desktop mode.
+ */
+ onHeadersReceivedInDesktopMode_: function(details) {
+ var headers = details.responseHeaders;
+ for (var i = 0; headers && i < headers.length; ++i) {
+ if (headers[i].name.toLowerCase() == 'google-accounts-signin') {
+ var headerValues = headers[i].value.toLowerCase().split(',');
+ var signinDetails = {};
+ headerValues.forEach(function(e) {
+ var pair = e.split('=');
+ signinDetails[pair[0].trim()] = pair[1].trim();
+ });
+ this.email_ = signinDetails['email'].slice(1, -1); // Remove "" around.
+ this.sessionIndex_ = signinDetails['sessionindex'];
+ return;
+ }
+ }