taweili-facebooker 1.0.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.autotest +15 -0
- data/CHANGELOG.rdoc +24 -0
- data/COPYING.rdoc +19 -0
- data/Manifest.txt +133 -0
- data/README.rdoc +104 -0
- data/Rakefile +85 -0
- data/TODO.rdoc +4 -0
- data/examples/desktop_login.rb +14 -0
- data/facebooker.gemspec +38 -0
- data/generators/facebook/facebook_generator.rb +14 -0
- data/generators/facebook/templates/config/facebooker.yml +49 -0
- data/generators/facebook/templates/public/javascripts/facebooker.js +83 -0
- data/generators/facebook_controller/USAGE +33 -0
- data/generators/facebook_controller/facebook_controller_generator.rb +40 -0
- data/generators/facebook_controller/templates/controller.rb +7 -0
- data/generators/facebook_controller/templates/functional_test.rb +11 -0
- data/generators/facebook_controller/templates/helper.rb +2 -0
- data/generators/facebook_controller/templates/view.fbml.erb +2 -0
- data/generators/facebook_controller/templates/view.html.erb +2 -0
- data/generators/facebook_publisher/facebook_publisher_generator.rb +14 -0
- data/generators/facebook_publisher/templates/create_facebook_templates.rb +15 -0
- data/generators/facebook_publisher/templates/publisher.rb +3 -0
- data/generators/facebook_scaffold/USAGE +27 -0
- data/generators/facebook_scaffold/facebook_scaffold_generator.rb +118 -0
- data/generators/facebook_scaffold/templates/controller.rb +93 -0
- data/generators/facebook_scaffold/templates/facebook_style.css +2579 -0
- data/generators/facebook_scaffold/templates/functional_test.rb +89 -0
- data/generators/facebook_scaffold/templates/helper.rb +2 -0
- data/generators/facebook_scaffold/templates/layout.fbml.erb +6 -0
- data/generators/facebook_scaffold/templates/layout.html.erb +17 -0
- data/generators/facebook_scaffold/templates/style.css +74 -0
- data/generators/facebook_scaffold/templates/view_edit.fbml.erb +13 -0
- data/generators/facebook_scaffold/templates/view_edit.html.erb +18 -0
- data/generators/facebook_scaffold/templates/view_index.fbml.erb +24 -0
- data/generators/facebook_scaffold/templates/view_index.html.erb +24 -0
- data/generators/facebook_scaffold/templates/view_new.fbml.erb +12 -0
- data/generators/facebook_scaffold/templates/view_new.html.erb +17 -0
- data/generators/facebook_scaffold/templates/view_show.fbml.erb +10 -0
- data/generators/facebook_scaffold/templates/view_show.html.erb +10 -0
- data/generators/publisher/publisher_generator.rb +14 -0
- data/generators/xd_receiver/templates/xd_receiver.html +10 -0
- data/generators/xd_receiver/xd_receiver_generator.rb +10 -0
- data/init.rb +25 -0
- data/install.rb +12 -0
- data/lib/facebooker/adapters/adapter_base.rb +91 -0
- data/lib/facebooker/adapters/bebo_adapter.rb +77 -0
- data/lib/facebooker/adapters/facebook_adapter.rb +52 -0
- data/lib/facebooker/admin.rb +42 -0
- data/lib/facebooker/batch_request.rb +45 -0
- data/lib/facebooker/data.rb +57 -0
- data/lib/facebooker/feed.rb +78 -0
- data/lib/facebooker/logging.rb +44 -0
- data/lib/facebooker/mobile.rb +20 -0
- data/lib/facebooker/mock/service.rb +50 -0
- data/lib/facebooker/mock/session.rb +18 -0
- data/lib/facebooker/model.rb +139 -0
- data/lib/facebooker/models/affiliation.rb +10 -0
- data/lib/facebooker/models/album.rb +11 -0
- data/lib/facebooker/models/applicationproperties.rb +39 -0
- data/lib/facebooker/models/applicationrestrictions.rb +10 -0
- data/lib/facebooker/models/cookie.rb +10 -0
- data/lib/facebooker/models/education_info.rb +11 -0
- data/lib/facebooker/models/event.rb +28 -0
- data/lib/facebooker/models/friend_list.rb +16 -0
- data/lib/facebooker/models/group.rb +36 -0
- data/lib/facebooker/models/info_item.rb +10 -0
- data/lib/facebooker/models/info_section.rb +10 -0
- data/lib/facebooker/models/location.rb +8 -0
- data/lib/facebooker/models/notifications.rb +17 -0
- data/lib/facebooker/models/page.rb +28 -0
- data/lib/facebooker/models/photo.rb +19 -0
- data/lib/facebooker/models/tag.rb +12 -0
- data/lib/facebooker/models/user.rb +497 -0
- data/lib/facebooker/models/video.rb +9 -0
- data/lib/facebooker/models/work_info.rb +10 -0
- data/lib/facebooker/parser.rb +650 -0
- data/lib/facebooker/rails/backwards_compatible_param_checks.rb +31 -0
- data/lib/facebooker/rails/controller.rb +337 -0
- data/lib/facebooker/rails/cucumber/world.rb +46 -0
- data/lib/facebooker/rails/cucumber.rb +28 -0
- data/lib/facebooker/rails/extensions/action_controller.rb +48 -0
- data/lib/facebooker/rails/extensions/rack_setup.rb +6 -0
- data/lib/facebooker/rails/extensions/routing.rb +15 -0
- data/lib/facebooker/rails/facebook_form_builder.rb +112 -0
- data/lib/facebooker/rails/facebook_pretty_errors.rb +22 -0
- data/lib/facebooker/rails/facebook_request_fix.rb +30 -0
- data/lib/facebooker/rails/facebook_request_fix_2-3.rb +31 -0
- data/lib/facebooker/rails/facebook_session_handling.rb +68 -0
- data/lib/facebooker/rails/facebook_url_helper.rb +192 -0
- data/lib/facebooker/rails/facebook_url_rewriting.rb +60 -0
- data/lib/facebooker/rails/helpers/fb_connect.rb +118 -0
- data/lib/facebooker/rails/helpers.rb +780 -0
- data/lib/facebooker/rails/integration_session.rb +38 -0
- data/lib/facebooker/rails/profile_publisher_extensions.rb +42 -0
- data/lib/facebooker/rails/publisher.rb +554 -0
- data/lib/facebooker/rails/routing.rb +49 -0
- data/lib/facebooker/rails/test_helpers.rb +68 -0
- data/lib/facebooker/rails/utilities.rb +22 -0
- data/lib/facebooker/server_cache.rb +24 -0
- data/lib/facebooker/service.rb +102 -0
- data/lib/facebooker/session.rb +606 -0
- data/lib/facebooker/version.rb +9 -0
- data/lib/facebooker.rb +180 -0
- data/lib/net/http_multipart_post.rb +123 -0
- data/lib/rack/facebook.rb +77 -0
- data/lib/tasks/facebooker.rake +18 -0
- data/lib/tasks/tunnel.rake +46 -0
- data/rails/init.rb +1 -0
- data/setup.rb +1585 -0
- data/templates/layout.erb +24 -0
- data/test/facebooker/adapters_test.rb +96 -0
- data/test/facebooker/admin_test.rb +102 -0
- data/test/facebooker/batch_request_test.rb +83 -0
- data/test/facebooker/data_test.rb +86 -0
- data/test/facebooker/logging_test.rb +43 -0
- data/test/facebooker/mobile_test.rb +45 -0
- data/test/facebooker/model_test.rb +133 -0
- data/test/facebooker/models/event_test.rb +15 -0
- data/test/facebooker/models/photo_test.rb +16 -0
- data/test/facebooker/models/user_test.rb +343 -0
- data/test/facebooker/rails/facebook_request_fix_2-3_test.rb +24 -0
- data/test/facebooker/rails/facebook_url_rewriting_test.rb +39 -0
- data/test/facebooker/rails/publisher_test.rb +481 -0
- data/test/facebooker/rails_integration_test.rb +1398 -0
- data/test/facebooker/server_cache_test.rb +44 -0
- data/test/facebooker/session_test.rb +614 -0
- data/test/facebooker_test.rb +951 -0
- data/test/fixtures/multipart_post_body_with_only_parameters.txt +33 -0
- data/test/fixtures/multipart_post_body_with_single_file.txt +38 -0
- data/test/fixtures/multipart_post_body_with_single_file_that_has_nil_key.txt +38 -0
- data/test/net/http_multipart_post_test.rb +52 -0
- data/test/rack/facebook_test.rb +61 -0
- data/test/rails_test_helper.rb +27 -0
- data/test/test_helper.rb +74 -0
- metadata +232 -0
@@ -0,0 +1,68 @@
|
|
1
|
+
module ActionController
|
2
|
+
class CgiRequest
|
3
|
+
alias :initialize_aliased_by_facebooker :initialize
|
4
|
+
|
5
|
+
def initialize(cgi, session_options = {})
|
6
|
+
initialize_aliased_by_facebooker(cgi, session_options)
|
7
|
+
@cgi.instance_variable_set("@request_params", request_parameters.merge(query_parameters))
|
8
|
+
end
|
9
|
+
|
10
|
+
DEFAULT_SESSION_OPTIONS[:cookie_only] = false
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module ActionController
|
15
|
+
class RackRequest < AbstractRequest #:nodoc:
|
16
|
+
alias :initialize_aliased_by_facebooker :initialize
|
17
|
+
|
18
|
+
def initialize(cgi, session_options = {})
|
19
|
+
initialize_aliased_by_facebooker(cgi, session_options)
|
20
|
+
@cgi.instance_variable_set("@request_params", request_parameters.merge(query_parameters))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class CGI
|
26
|
+
class Session
|
27
|
+
alias :initialize_aliased_by_facebooker :initialize
|
28
|
+
attr_reader :request, :initialization_options
|
29
|
+
|
30
|
+
def initialize(request, option={})
|
31
|
+
@request = request
|
32
|
+
@initialization_options = option
|
33
|
+
option['session_id'] ||= set_session_id
|
34
|
+
initialize_aliased_by_facebooker(request, option)
|
35
|
+
end
|
36
|
+
|
37
|
+
def set_session_id
|
38
|
+
if session_key_should_be_set_with_facebook_session_key?
|
39
|
+
request_parameters[facebook_session_key]
|
40
|
+
else
|
41
|
+
request_parameters[session_key]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def request_parameters
|
46
|
+
request.instance_variable_get("@request_params")
|
47
|
+
end
|
48
|
+
|
49
|
+
def session_key_should_be_set_with_facebook_session_key?
|
50
|
+
request_parameters[session_key].blank? && !request_parameters[facebook_session_key].blank?
|
51
|
+
end
|
52
|
+
|
53
|
+
def session_key
|
54
|
+
initialization_options['session_key'] || '_session_id'
|
55
|
+
end
|
56
|
+
|
57
|
+
def facebook_session_key
|
58
|
+
'fb_sig_session_key'
|
59
|
+
end
|
60
|
+
|
61
|
+
alias :create_new_id_aliased_by_facebooker :create_new_id
|
62
|
+
|
63
|
+
def create_new_id
|
64
|
+
@new_session = true
|
65
|
+
@session_id || create_new_id_aliased_by_facebooker
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,192 @@
|
|
1
|
+
# Extends the ActionView::Helpers::UrlHelper module. See it for details on
|
2
|
+
# the usual url helper methods: url_for, link_to, button_to, etc.
|
3
|
+
#
|
4
|
+
# Mostly, the changes sanitize javascript into facebook javascript.
|
5
|
+
# It sanitizes link_to solely by altering the private methods:
|
6
|
+
# convert_options_to_javascript!, confirm_javascript_function, and
|
7
|
+
# method_javascript_function. For button_to, it alters button_to
|
8
|
+
# itself, as well as confirm_javascript_function. No other methods
|
9
|
+
# need to be changed because of Facebook javascript.
|
10
|
+
#
|
11
|
+
# For button_to and link_to, adds alternate confirm options for facebook.
|
12
|
+
# ==== Options
|
13
|
+
# * <tt>:confirm => 'question?'</tt> - This will add a JavaScript confirm
|
14
|
+
# prompt with the question specified.
|
15
|
+
#
|
16
|
+
# Example:
|
17
|
+
# # Generates: <a href="http://rubyforge.org/projects/facebooker" onclick="
|
18
|
+
# # var dlg = new Dialog().showChoice('Please Confirm', 'Go to Facebooker?').setStyle();
|
19
|
+
# # var a=this;dlg.onconfirm = function() {
|
20
|
+
# # document.setLocation(a.getHref());
|
21
|
+
# # }; return false;">Facebooker</a>
|
22
|
+
# link_to("Facebooker", "http://rubyforge.org/projects/facebooker", :confirm=>"Go to Facebooker?")
|
23
|
+
#
|
24
|
+
# Alternatively, options[:confirm] may be specified.
|
25
|
+
# See the Facebook page http://wiki.developers.facebook.com/index.php/FBJS.
|
26
|
+
# These options are:
|
27
|
+
# <tt>:title</tt>:: Specifies the title of the Facebook dialog. Default is "Please Confirm".
|
28
|
+
# <tt>:content</tt>:: Specifies the title of the Facebook dialog. Default is "Are you sure?".
|
29
|
+
#
|
30
|
+
# Example:
|
31
|
+
# # Generates: <a href="http://rubyforge.org/projects/facebooker" onclick="
|
32
|
+
# # var dlg = new Dialog().showChoice('the page says:', 'Go to Facebooker?').setStyle();
|
33
|
+
# # var a=this;dlg.onconfirm = function() {
|
34
|
+
# # document.setLocation(a.getHref());
|
35
|
+
# # }; return false;">Facebooker</a>
|
36
|
+
# link_to("Facebooker", "http://rubyforge.org/projects/facebooker", :confirm=>{:title=>"the page says:", :content=>"Go to Facebooker?"})
|
37
|
+
#
|
38
|
+
# Any other options passed are assumed to be css styles.
|
39
|
+
# Again, see the Facebook page http://wiki.developers.facebook.com/index.php/FBJS.
|
40
|
+
#
|
41
|
+
# Example:
|
42
|
+
# # Generates: <a href="http://rubyforge.org/projects/facebooker" onclick="
|
43
|
+
# # var dlg = new Dialog().showChoice('the page says:', 'Are you sure?').setStyle({color: 'pink', width: '200px'});
|
44
|
+
# # var a=this;dlg.onconfirm = function() {
|
45
|
+
# # document.setLocation(a.getHref());
|
46
|
+
# # }; return false;">Facebooker</a>
|
47
|
+
# link_to("Facebooker", "http://rubyforge.org/projects/facebooker", :confirm=>{:title=>"the page says:, :color=>"pink", :width=>"200px"})
|
48
|
+
module ActionView
|
49
|
+
module Helpers
|
50
|
+
module UrlHelper
|
51
|
+
# Alters one and only one line of the Rails button_to. See below.
|
52
|
+
def button_to_with_facebooker(name, options={}, html_options = {})
|
53
|
+
if !respond_to?(:request_comes_from_facebook?) || !request_comes_from_facebook?
|
54
|
+
button_to_without_facebooker(name,options,html_options)
|
55
|
+
else
|
56
|
+
html_options = html_options.stringify_keys
|
57
|
+
convert_boolean_attributes!(html_options, %w( disabled ))
|
58
|
+
|
59
|
+
method_tag = ''
|
60
|
+
if (method = html_options.delete('method')) && %w{put delete}.include?(method.to_s)
|
61
|
+
method_tag = tag('input', :type => 'hidden', :name => '_method', :value => method.to_s)
|
62
|
+
end
|
63
|
+
|
64
|
+
form_method = method.to_s == 'get' ? 'get' : 'post'
|
65
|
+
|
66
|
+
request_token_tag = ''
|
67
|
+
if form_method == 'post' && protect_against_forgery?
|
68
|
+
request_token_tag = tag(:input, :type => "hidden", :name => request_forgery_protection_token.to_s, :value => form_authenticity_token)
|
69
|
+
end
|
70
|
+
|
71
|
+
if confirm = html_options.delete("confirm")
|
72
|
+
# this line is the only change => html_options["onclick"] = "return #{confirm_javascript_function(confirm)}"
|
73
|
+
html_options["onclick"] = "#{confirm_javascript_function(confirm, 'a.getForm().submit();')}return false;"
|
74
|
+
end
|
75
|
+
|
76
|
+
url = options.is_a?(String) ? options : self.url_for(options)
|
77
|
+
name ||= url
|
78
|
+
|
79
|
+
html_options.merge!("type" => "submit", "value" => name)
|
80
|
+
|
81
|
+
"<form method=\"#{form_method}\" action=\"#{escape_once url}\" class=\"button-to\"><div>" +
|
82
|
+
method_tag + tag("input", html_options) + request_token_tag + "</div></form>"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
alias_method_chain :button_to, :facebooker
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
# Altered to throw an error on :popup and sanitize the javascript
|
91
|
+
# for Facebook.
|
92
|
+
def convert_options_to_javascript_with_facebooker!(html_options, url ='')
|
93
|
+
if !respond_to?(:request_comes_from_facebook?) || !request_comes_from_facebook?
|
94
|
+
convert_options_to_javascript_without_facebooker!(html_options,url)
|
95
|
+
else
|
96
|
+
confirm, popup = html_options.delete("confirm"), html_options.delete("popup")
|
97
|
+
|
98
|
+
method, href = html_options.delete("method"), html_options['href']
|
99
|
+
|
100
|
+
html_options["onclick"] = case
|
101
|
+
when popup
|
102
|
+
raise ActionView::ActionViewError, "You can't use :popup"
|
103
|
+
when method # or maybe (confirm and method)
|
104
|
+
"#{method_javascript_function(method, url, href, confirm)}return false;"
|
105
|
+
when confirm # and only confirm
|
106
|
+
"#{confirm_javascript_function(confirm)}return false;"
|
107
|
+
else
|
108
|
+
html_options["onclick"]
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
alias_method_chain :convert_options_to_javascript!, :facebooker
|
114
|
+
|
115
|
+
|
116
|
+
# Overrides a private method that link_to calls via convert_options_to_javascript! and
|
117
|
+
# also, button_to calls directly. For Facebook, confirm can be a hash of options to
|
118
|
+
# stylize the Facebook dialog. Takes :title, :content, :style options. See
|
119
|
+
# the Facebook page http://wiki.developers.facebook.com/index.php/FBJS for valid
|
120
|
+
# style formats like "color: 'black', background: 'white'" or like "'color','black'".
|
121
|
+
#
|
122
|
+
# == Examples ==
|
123
|
+
#
|
124
|
+
# link_to("Facebooker", "http://rubyforge.org/projects/facebooker", :confirm=>"Go to Facebooker?")
|
125
|
+
# link_to("Facebooker", "http://rubyforge.org/projects/facebooker", :confirm=>{:title=>"the page says:, :content=>"Go to Facebooker?"})
|
126
|
+
# link_to("Facebooker", "http://rubyforge.org/projects/facebooker", :confirm=>{:title=>"the page says:, :content=>"Go to Facebooker?", :color=>"pink"})
|
127
|
+
def confirm_javascript_function_with_facebooker(confirm, fun = nil)
|
128
|
+
if !respond_to?(:request_comes_from_facebook?) || !request_comes_from_facebook?
|
129
|
+
confirm_javascript_function_without_facebooker(confirm)
|
130
|
+
else
|
131
|
+
if(confirm.is_a?(Hash))
|
132
|
+
confirm_options = confirm.stringify_keys
|
133
|
+
title = confirm_options.delete("title") || "Please Confirm"
|
134
|
+
content = confirm_options.delete("content") || "Are you sure?"
|
135
|
+
button_confirm = confirm_options.delete("button_confirm") || "Okay"
|
136
|
+
button_cancel = confirm_options.delete("button_cancel") || "Cancel"
|
137
|
+
style = confirm_options.empty? ? "" : convert_options_to_css(confirm_options)
|
138
|
+
else
|
139
|
+
title,content,style,button_confirm,button_cancel = 'Please Confirm', confirm, "", "Okay", "Cancel"
|
140
|
+
end
|
141
|
+
"var dlg = new Dialog().showChoice('#{escape_javascript(title.to_s)}','#{escape_javascript(content.to_s)}','#{escape_javascript(button_confirm.to_s)}','#{escape_javascript(button_cancel.to_s)}').setStyle(#{style});"+
|
142
|
+
"var a=this;dlg.onconfirm = function() { #{fun ? fun : 'document.setLocation(a.getHref());'} };"
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
alias_method_chain :confirm_javascript_function, :facebooker
|
147
|
+
|
148
|
+
def convert_options_to_css(options)
|
149
|
+
key_pair = options.shift
|
150
|
+
style = "{#{key_pair[0]}: '#{key_pair[1]}'"
|
151
|
+
for key in options.keys
|
152
|
+
style << ", #{key}: '#{options[key]}'"
|
153
|
+
end
|
154
|
+
style << "}"
|
155
|
+
end
|
156
|
+
|
157
|
+
# Dynamically creates a form for link_to with method. Calls confirm_javascript_function if and
|
158
|
+
# only if (confirm && method) for link_to
|
159
|
+
def method_javascript_function_with_facebooker(method, url = '', href = nil, confirm = nil)
|
160
|
+
if !respond_to?(:request_comes_from_facebook?) || !request_comes_from_facebook?
|
161
|
+
method_javascript_function_without_facebooker(method,url,href)
|
162
|
+
else
|
163
|
+
action = (href && url.size > 0) ? "'#{url}'" : 'a.getHref()'
|
164
|
+
submit_function =
|
165
|
+
"var f = document.createElement('form'); f.setStyle('display','none'); " +
|
166
|
+
"a.getParentNode().appendChild(f); f.setMethod('POST'); f.setAction(#{action});"
|
167
|
+
|
168
|
+
unless method == :post
|
169
|
+
submit_function << "var m = document.createElement('input'); m.setType('hidden'); "
|
170
|
+
submit_function << "m.setName('_method'); m.setValue('#{method}'); f.appendChild(m);"
|
171
|
+
end
|
172
|
+
|
173
|
+
if protect_against_forgery?
|
174
|
+
submit_function << "var s = document.createElement('input'); s.setType('hidden'); "
|
175
|
+
submit_function << "s.setName('#{request_forgery_protection_token}'); s.setValue('#{escape_javascript form_authenticity_token}'); f.appendChild(s);"
|
176
|
+
end
|
177
|
+
submit_function << "f.submit();"
|
178
|
+
|
179
|
+
if(confirm)
|
180
|
+
confirm_javascript_function(confirm, submit_function)
|
181
|
+
else
|
182
|
+
"var a=this;" + submit_function
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
alias_method_chain :method_javascript_function, :facebooker
|
188
|
+
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module ::ActionController
|
2
|
+
if Rails.version < '2.3'
|
3
|
+
class AbstractRequest
|
4
|
+
def relative_url_root
|
5
|
+
Facebooker.path_prefix
|
6
|
+
end
|
7
|
+
end
|
8
|
+
else
|
9
|
+
class Request
|
10
|
+
def relative_url_root
|
11
|
+
Facebooker.path_prefix
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class Base
|
17
|
+
class << self
|
18
|
+
alias :old_relative_url_root :relative_url_root
|
19
|
+
def relative_url_root
|
20
|
+
Facebooker.path_prefix
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class UrlRewriter
|
26
|
+
include Facebooker::Rails::BackwardsCompatibleParamChecks
|
27
|
+
|
28
|
+
RESERVED_OPTIONS << :canvas
|
29
|
+
|
30
|
+
def link_to_new_canvas?
|
31
|
+
one_or_true @request.parameters["fb_sig_in_new_facebook"]
|
32
|
+
end
|
33
|
+
|
34
|
+
def link_to_canvas?(params, options)
|
35
|
+
option_override = options[:canvas]
|
36
|
+
return false if option_override == false # important to check for false. nil should use default behavior
|
37
|
+
option_override || (can_safely_access_request_parameters? && (one_or_true(@request.parameters["fb_sig_in_canvas"]) || one_or_true(@request.parameters[:fb_sig_in_canvas]) ))
|
38
|
+
end
|
39
|
+
|
40
|
+
#rails blindly tries to merge things that may be nil into the parameters. Make sure this won't break
|
41
|
+
def can_safely_access_request_parameters?
|
42
|
+
@request.request_parameters
|
43
|
+
end
|
44
|
+
|
45
|
+
def rewrite_url_with_facebooker(*args)
|
46
|
+
options = args.first.is_a?(Hash) ? args.first : args.last
|
47
|
+
is_link_to_canvas = link_to_canvas?(@request.request_parameters, options)
|
48
|
+
if is_link_to_canvas && !options.has_key?(:host)
|
49
|
+
options[:host] = Facebooker.canvas_server_base
|
50
|
+
end
|
51
|
+
options.delete(:canvas)
|
52
|
+
Facebooker.request_for_canvas(is_link_to_canvas) do
|
53
|
+
rewrite_url_without_facebooker(*args)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
alias_method_chain :rewrite_url, :facebooker
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
module Facebooker
|
2
|
+
module Rails
|
3
|
+
module Helpers
|
4
|
+
module FbConnect
|
5
|
+
|
6
|
+
def fb_connect_javascript_tag
|
7
|
+
if request.ssl?
|
8
|
+
javascript_include_tag "https://www.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php"
|
9
|
+
else
|
10
|
+
javascript_include_tag "http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
#
|
15
|
+
# For information on the :app_settings argument see http://wiki.developers.facebook.com/index.php/JS_API_M_FB.Facebook.Init_2
|
16
|
+
# While it would be nice to treat :app_settings as a hash, some of the arguments do different things if they are a string vs a javascript function
|
17
|
+
# and Rails' Hash#to_json always quotes strings so there is no way to indicate when the value should be a javascript function.
|
18
|
+
# For this reason :app_settings needs to be a string that is valid JSON (including the {}'s).
|
19
|
+
#
|
20
|
+
def init_fb_connect(*required_features,&proc)
|
21
|
+
additions = ""
|
22
|
+
if block_given?
|
23
|
+
additions = capture(&proc)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Yes, app_settings is set to a string of an empty JSON element. That's intentional.
|
27
|
+
options = {:js => :prototype, :app_settings => '{}'}
|
28
|
+
|
29
|
+
if required_features.last.is_a?(Hash)
|
30
|
+
options.merge!(required_features.pop.symbolize_keys)
|
31
|
+
end
|
32
|
+
|
33
|
+
if request.ssl?
|
34
|
+
init_string = "FB.Facebook.init('#{Facebooker.api_key}','/xd_receiver_ssl.html', #{options[:app_settings]});"
|
35
|
+
else
|
36
|
+
init_string = "FB.Facebook.init('#{Facebooker.api_key}','/xd_receiver.html', #{options[:app_settings]});"
|
37
|
+
end
|
38
|
+
unless required_features.blank?
|
39
|
+
init_string = <<-FBML
|
40
|
+
#{case options[:js]
|
41
|
+
when :jquery then "$(document).ready("
|
42
|
+
when :dojo then "dojo.addOnLoad("
|
43
|
+
else "Element.observe(window,'load',"
|
44
|
+
end} function() {
|
45
|
+
FB_RequireFeatures(#{required_features.to_json}, function() {
|
46
|
+
#{init_string}
|
47
|
+
#{additions}
|
48
|
+
});
|
49
|
+
});
|
50
|
+
FBML
|
51
|
+
end
|
52
|
+
|
53
|
+
# block_is_within_action_view? is rails 2.1.x and has been
|
54
|
+
# deprecated. rails >= 2.2.x uses block_called_from_erb?
|
55
|
+
block_tester = respond_to?(:block_is_within_action_view?) ?
|
56
|
+
:block_is_within_action_view? : :block_called_from_erb?
|
57
|
+
|
58
|
+
if block_given? && send(block_tester, proc)
|
59
|
+
concat(javascript_tag(init_string))
|
60
|
+
else
|
61
|
+
javascript_tag init_string
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Render an <fb:login-button> element
|
66
|
+
#
|
67
|
+
# ==== Examples
|
68
|
+
#
|
69
|
+
# <%= fb_login_button%>
|
70
|
+
# => <fb:login-button></fb:login-button>
|
71
|
+
#
|
72
|
+
# Specifying a javascript callback
|
73
|
+
#
|
74
|
+
# <%= fb_login_button 'update_something();'%>
|
75
|
+
# => <fb:login-button onlogin='update_something();'></fb:login-button>
|
76
|
+
#
|
77
|
+
# Adding options <em>See:</em> http://wiki.developers.facebook.com/index.php/Fb:login-button
|
78
|
+
#
|
79
|
+
# <%= fb_login_button 'update_something();', :size => :small, :background => :dark%>
|
80
|
+
# => <fb:login-button background='dark' onlogin='update_something();' size='small'></fb:login-button>
|
81
|
+
#
|
82
|
+
def fb_login_button(*args)
|
83
|
+
|
84
|
+
callback = args.first
|
85
|
+
options = args[1] || {}
|
86
|
+
options.merge!(:onlogin=>callback)if callback
|
87
|
+
|
88
|
+
content_tag("fb:login-button",nil, options)
|
89
|
+
end
|
90
|
+
|
91
|
+
def fb_login_and_redirect(url, options = {})
|
92
|
+
js = update_page do |page|
|
93
|
+
page.redirect_to url
|
94
|
+
end
|
95
|
+
content_tag("fb:login-button",nil,options.merge(:onlogin=>js))
|
96
|
+
end
|
97
|
+
|
98
|
+
def fb_unconnected_friends_count
|
99
|
+
content_tag "fb:unconnected-friends-count",nil
|
100
|
+
end
|
101
|
+
|
102
|
+
def fb_logout_link(text,url,*args)
|
103
|
+
js = update_page do |page|
|
104
|
+
page.call "FB.Connect.logoutAndRedirect",url
|
105
|
+
end
|
106
|
+
link_to_function text, js, *args
|
107
|
+
end
|
108
|
+
|
109
|
+
def fb_user_action(action, user_message = nil, prompt = "", callback = nil)
|
110
|
+
update_page do |page|
|
111
|
+
page.call("FB.Connect.showFeedDialog",action.template_id,action.data,action.target_ids,action.body_general,nil,page.literal("FB.RequireConnect.promptConnect"),callback,prompt,user_message.nil? ? nil : {:value=>user_message})
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|