facebooker 1.0.18 → 1.0.29

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.
Files changed (41) hide show
  1. data/{History.txt → CHANGELOG.rdoc} +0 -0
  2. data/{COPYING → COPYING.rdoc} +0 -0
  3. data/{README.txt → README.rdoc} +11 -4
  4. data/Rakefile +18 -15
  5. data/{TODO.txt → TODO.rdoc} +0 -0
  6. data/generators/facebook/templates/config/facebooker.yml +3 -0
  7. data/init.rb +12 -61
  8. data/lib/facebooker.rb +22 -15
  9. data/lib/facebooker/adapters/adapter_base.rb +3 -0
  10. data/lib/facebooker/logging.rb +1 -1
  11. data/lib/facebooker/model.rb +6 -4
  12. data/lib/facebooker/models/user.rb +39 -4
  13. data/lib/facebooker/parser.rb +14 -0
  14. data/lib/facebooker/rails/controller.rb +34 -10
  15. data/lib/facebooker/rails/extensions/action_controller.rb +48 -0
  16. data/lib/facebooker/rails/extensions/rack_setup.rb +2 -0
  17. data/lib/facebooker/rails/extensions/routing.rb +15 -0
  18. data/lib/facebooker/rails/facebook_url_helper.rb +3 -3
  19. data/lib/facebooker/rails/facebook_url_rewriting.rb +18 -5
  20. data/lib/facebooker/rails/helpers.rb +19 -2
  21. data/lib/facebooker/rails/helpers/fb_connect.rb +20 -10
  22. data/lib/facebooker/rails/publisher.rb +9 -5
  23. data/lib/facebooker/service.rb +1 -2
  24. data/lib/facebooker/session.rb +13 -1
  25. data/lib/facebooker/version.rb +1 -1
  26. data/lib/rack/facebook.rb +77 -0
  27. data/lib/tasks/tunnel.rake +3 -3
  28. data/test/facebooker/logging_test.rb +2 -2
  29. data/test/facebooker/models/user_test.rb +39 -3
  30. data/test/facebooker/rails/publisher_test.rb +19 -3
  31. data/test/facebooker/rails_integration_test.rb +52 -6
  32. data/test/rack/facebook_test.rb +62 -0
  33. data/test/rails_test_helper.rb +2 -0
  34. metadata +21 -27
  35. data/CHANGELOG.txt +0 -0
  36. data/Manifest.txt +0 -127
  37. data/README +0 -46
  38. data/lib/facebooker/models/user.rb.orig +0 -396
  39. data/lib/facebooker/models/user.rb.rej +0 -17
  40. data/lib/facebooker/session.rb.orig +0 -564
  41. data/lib/facebooker/session.rb.rej +0 -29
File without changes
File without changes
@@ -1,4 +1,4 @@
1
- = facebooker
1
+ = Facebooker
2
2
 
3
3
  * http://facebooker.rubyforge.org
4
4
 
@@ -22,6 +22,7 @@ Facebooker is a Ruby wrapper over the Facebook[http://facebook.com] {REST API}[h
22
22
  == SYNOPSIS:
23
23
 
24
24
  View David Clements' {excellent tutorial}[http://apps.facebook.com/facebooker_tutorial] at {http://apps.facebook.com/facebooker_tutorial/}[http://apps.facebook.com/facebooker_tutorial] or check out {Developing Facebook Platform Applications with Rails}[http://www.pragprog.com/titles/mmfacer].
25
+ {Join the Mailing List}:[groups.google.com/group/facebooker]
25
26
 
26
27
  == REQUIREMENTS:
27
28
 
@@ -29,7 +30,7 @@ None
29
30
 
30
31
  == INSTALL:
31
32
 
32
- * Non Rails
33
+ === Non Rails
33
34
 
34
35
  The best way is:
35
36
 
@@ -39,7 +40,7 @@ If, for some reason, you can't/won't use RubyGems, you can do:
39
40
 
40
41
  (sudo) ruby setup.rb
41
42
 
42
- * Rails
43
+ === Rails
43
44
 
44
45
  Facebooker can be installed as a Rails plugin by:
45
46
 
@@ -75,7 +76,13 @@ end
75
76
 
76
77
  (The MIT License)
77
78
 
78
- Copyright (c) 2008 FIX
79
+ Copyright (c) 2008-2009:
80
+
81
+ * Chad Fowler
82
+ * Patrick Ewing
83
+ * Mike Mangino
84
+ * Shane Vitarana
85
+ * Corey Innis
79
86
 
80
87
  Permission is hereby granted, free of charge, to any person obtaining
81
88
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -9,20 +9,19 @@ rescue LoadError
9
9
  $stderr.puts "Install the multi_rails gem to run tests against multiple versions of Rails"
10
10
  end
11
11
 
12
- $: << File.dirname(__FILE__) + '/lib'
12
+ $: << File.dirname(__FILE__) + '/lib'
13
13
  require './lib/facebooker.rb'
14
14
 
15
- Hoe.new('facebooker', Facebooker::VERSION::STRING) do |p|
15
+ HOE = Hoe.new('facebooker', Facebooker::VERSION::STRING) do |p|
16
16
  p.rubyforge_name = 'facebooker'
17
17
  p.author = ['Chad Fowler', 'Patrick Ewing', 'Mike Mangino', 'Shane Vitarana', 'Corey Innis']
18
18
  p.email = 'mmangino@elevatedrails.com'
19
- p.summary = 'Pure, idiomatic Ruby wrapper for the Facebook REST API.'
20
- p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
21
- p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
22
- p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
19
+ p.readme_file = 'README.rdoc'
20
+ p.history_file = 'CHANGELOG.rdoc'
23
21
  p.remote_rdoc_dir = '' # Release to root
24
22
  p.test_globs = 'test/**/*_test.rb'
25
23
  p.extra_deps << ['json', '>= 1.0.0']
24
+ p.extra_rdoc_files = FileList['*.rdoc']
26
25
  end
27
26
 
28
27
  require 'rcov/rcovtask'
@@ -42,16 +41,20 @@ namespace :test do
42
41
  end
43
42
  end
44
43
 
45
- gem_spec_file = 'facebooker.gemspec'
46
-
47
- gem_spec = eval(File.read(gem_spec_file)) rescue nil
48
-
49
- desc "Generate the gemspec file."
50
- task :gemspec do
51
- require 'erb'
44
+ namespace :gem do
45
+ task :spec do
46
+ File.open("#{HOE.name}.gemspec", 'w') do |f|
47
+ f.write(HOE.spec.to_ruby)
48
+ end
49
+ end
52
50
 
53
- File.open(gem_spec_file, 'w') do |f|
54
- f.write ERB.new(File.read("#{gem_spec_file}.erb")).result(binding)
51
+ namespace :spec do
52
+ task :dev do
53
+ File.open("#{HOE.name}.gemspec", 'w') do |f|
54
+ HOE.spec.version = "#{HOE.version}.#{Time.now.strftime("%Y%m%d%H%M%S")}"
55
+ f.write(HOE.spec.to_ruby)
56
+ end
57
+ end
55
58
  end
56
59
  end
57
60
 
File without changes
@@ -20,6 +20,7 @@ development:
20
20
  public_host:
21
21
  public_port: 4007
22
22
  local_port: 3000
23
+ server_alive_interval: 0
23
24
 
24
25
  test:
25
26
  api_key:
@@ -32,6 +33,7 @@ test:
32
33
  public_host:
33
34
  public_port: 4007
34
35
  local_port: 3000
36
+ server_alive_interval: 0
35
37
 
36
38
  production:
37
39
  api_key:
@@ -44,3 +46,4 @@ production:
44
46
  public_host:
45
47
  public_port: 4007
46
48
  local_port: 3000
49
+ server_alive_interval: 0
data/init.rb CHANGED
@@ -9,64 +9,15 @@ FACEBOOKER = Facebooker.load_configuration(facebook_config)
9
9
  Facebooker.logger = RAILS_DEFAULT_LOGGER if Object.const_defined? :RAILS_DEFAULT_LOGGER
10
10
 
11
11
  require 'net/http_multipart_post'
12
- require 'facebooker/rails/controller'
13
- require 'facebooker/rails/facebook_url_rewriting'
14
- require 'facebooker/rails/facebook_session_handling'
15
- require 'facebooker/rails/facebook_request_fix'
16
- require 'facebooker/rails/routing'
17
- require 'facebooker/rails/facebook_pretty_errors' rescue nil
18
- require 'facebooker/rails/facebook_url_helper'
19
- module ::ActionController
20
- class Base
21
- def self.inherited_with_facebooker(subclass)
22
- inherited_without_facebooker(subclass)
23
- if subclass.to_s == "ApplicationController"
24
- subclass.send(:include,Facebooker::Rails::Controller)
25
- subclass.helper Facebooker::Rails::Helpers
26
- end
27
- end
28
- class << self
29
- alias_method_chain :inherited, :facebooker
30
- end
31
- end
32
- end
33
-
34
- class ActionController::Routing::Route
35
- def recognition_conditions_with_facebooker
36
- defaults = recognition_conditions_without_facebooker
37
- defaults << " env[:canvas] == conditions[:canvas] " if conditions[:canvas]
38
- defaults
39
- end
40
- alias_method_chain :recognition_conditions, :facebooker
41
- end
42
-
43
- # When making get requests, Facebook sends fb_sig parameters both in the query string
44
- # and also in the post body. We want to ignore the query string ones because they are one
45
- # request out of date
46
- # We only do thise when there are POST parameters so that IFrame linkage still works
47
- class ActionController::AbstractRequest
48
- def query_parameters_with_facebooker
49
- if request_parameters.blank?
50
- query_parameters_without_facebooker
51
- else
52
- (query_parameters_without_facebooker||{}).reject {|key,value| key.to_s =~ /^fb_sig/}
53
- end
54
- end
55
-
56
- alias_method_chain :query_parameters, :facebooker
57
- end
58
-
59
- # We turn off route optimization to make named routes use our code for figuring out if they should go to the session
60
- # If this fails, it means we're on rails 1.2, we can ignore it
61
- begin
62
- ActionController::Base::optimise_named_routes = false
63
- rescue NoMethodError=>e
64
- nil
65
- end
66
-
67
- # pull :canvas=> into env in routing to allow for conditions
68
- ActionController::Routing::RouteSet.send :include, Facebooker::Rails::Routing::RouteSetExtensions
69
- ActionController::Routing::RouteSet::Mapper.send :include, Facebooker::Rails::Routing::MapperExtensions
70
-
71
- Mime::Type.register_alias "text/html", :fbml
72
- Mime::Type.register_alias "text/javascript", :fbjs
12
+ if defined? Rails
13
+ require 'facebooker/rails/controller'
14
+ require 'facebooker/rails/facebook_url_rewriting'
15
+ require 'facebooker/rails/facebook_session_handling' if Rails.version < '2.3'
16
+ require 'facebooker/rails/facebook_request_fix' if Rails.version < '2.3'
17
+ require 'facebooker/rails/routing'
18
+ require 'facebooker/rails/facebook_pretty_errors' rescue nil
19
+ require 'facebooker/rails/facebook_url_helper'
20
+ require 'facebooker/rails/extensions/rack_setup' if Rails.version > '2.3'
21
+ require 'facebooker/rails/extensions/action_controller'
22
+ require 'facebooker/rails/extensions/routing'
23
+ end
@@ -28,27 +28,34 @@ module Facebooker
28
28
  def load_configuration(facebooker_yaml_file)
29
29
  if File.exist?(facebooker_yaml_file)
30
30
  if defined? RAILS_ENV
31
- facebooker = YAML.load_file(facebooker_yaml_file)[RAILS_ENV]
31
+ config = YAML.load_file(facebooker_yaml_file)[RAILS_ENV]
32
32
  else
33
- facebooker = YAML.load_file(facebooker_yaml_file)
33
+ config = YAML.load_file(facebooker_yaml_file)
34
34
  end
35
- ENV['FACEBOOK_API_KEY'] = facebooker['api_key']
36
- ENV['FACEBOOK_SECRET_KEY'] = facebooker['secret_key']
37
- ENV['FACEBOOKER_RELATIVE_URL_ROOT'] = facebooker['canvas_page_name']
38
- ENV['FACEBOOKER_API'] = facebooker['api']
39
- if facebooker.has_key?('set_asset_host_to_callback_url')
40
- Facebooker.set_asset_host_to_callback_url = facebooker['set_asset_host_to_callback_url']
41
- end
42
- Facebooker.timeout = facebooker['timeout']
43
- if Object.const_defined?("ActionController")
44
- ActionController::Base.asset_host = facebooker['callback_url'] if(ActionController::Base.asset_host.blank?) && Facebooker.set_asset_host_to_callback_url
45
- end
46
- @facebooker_configuration = facebooker
35
+ apply_configuration(config)
36
+ end
37
+ end
38
+
39
+ # Sets the Facebook environment based on a hash of options.
40
+ # By default the hash passed in is loaded from facebooker.yml, but it can also be passed in
41
+ # manually every request to run multiple Facebook apps off one Rails app.
42
+ def apply_configuration(config)
43
+ ENV['FACEBOOK_API_KEY'] = config['api_key']
44
+ ENV['FACEBOOK_SECRET_KEY'] = config['secret_key']
45
+ ENV['FACEBOOKER_RELATIVE_URL_ROOT'] = config['canvas_page_name']
46
+ ENV['FACEBOOKER_API'] = config['api']
47
+ if config.has_key?('set_asset_host_to_callback_url')
48
+ Facebooker.set_asset_host_to_callback_url = config['set_asset_host_to_callback_url']
49
+ end
50
+ if Object.const_defined?("ActionController") and Facebooker.set_asset_host_to_callback_url
51
+ ActionController::Base.asset_host = config['callback_url']
47
52
  end
53
+ Facebooker.timeout = config['timeout']
54
+ @facebooker_configuration = config
48
55
  end
49
56
 
50
57
  def facebooker_config
51
- @facebooker_configuration
58
+ @facebooker_configuration || {} # to prevent pretty_errors error if the config hasn't been set yet
52
59
  end
53
60
 
54
61
  def current_adapter=(adapter_class)
@@ -68,6 +68,9 @@ module Facebooker
68
68
  end
69
69
  return adapter_class.new(adapter_config)
70
70
  end
71
+
72
+ return self.default_adapter(params)
73
+
71
74
  end
72
75
 
73
76
  def self.default_adapter(params = {})
@@ -44,7 +44,7 @@ module Facebooker
44
44
  def self.log_info(message, dump, seconds = 0)
45
45
  return unless Facebooker.logger
46
46
  log_message = "#{message} (#{seconds}) #{dump}"
47
- Facebooker.logger.debug(log_message)
47
+ Facebooker.logger.info(log_message)
48
48
  end
49
49
 
50
50
  end
@@ -122,10 +122,12 @@ module Facebooker
122
122
  unless hash.nil? || hash.empty?
123
123
  hash.each do |key, value|
124
124
  set_attr_method = "#{key}="
125
- if !value.nil? && respond_to?(set_attr_method)
126
- self.__send__(set_attr_method, value)
127
- else
128
- Facebooker::Logging.log_info("**Warning**, Attempt to set non-attribute: #{key}",hash)
125
+ unless value.nil?
126
+ if respond_to?(set_attr_method)
127
+ self.__send__(set_attr_method, value)
128
+ else
129
+ Facebooker::Logging.log_info("**Warning**, Attempt to set non-attribute: #{key}",hash)
130
+ end
129
131
  end
130
132
  end
131
133
  @populated = true
@@ -10,7 +10,7 @@ module Facebooker
10
10
  include Model
11
11
  attr_accessor :message, :time, :status_id
12
12
  end
13
- FIELDS = [:status, :political, :pic_small, :name, :quotes, :is_app_user, :tv, :profile_update_time, :meeting_sex, :hs_info, :timezone, :relationship_status, :hometown_location, :about_me, :wall_count, :significant_other_id, :pic_big, :music, :uid, :work_history, :sex, :religion, :notes_count, :activities, :pic_square, :movies, :has_added_app, :education_history, :birthday, :first_name, :meeting_for, :last_name, :interests, :current_location, :pic, :books, :affiliations, :locale, :profile_url, :proxied_email, :email_hashes, :allowed_restrictions]
13
+ FIELDS = [:status, :political, :pic_small, :name, :quotes, :is_app_user, :tv, :profile_update_time, :meeting_sex, :hs_info, :timezone, :relationship_status, :hometown_location, :about_me, :wall_count, :significant_other_id, :pic_big, :music, :uid, :work_history, :sex, :religion, :notes_count, :activities, :pic_square, :movies, :has_added_app, :education_history, :birthday, :first_name, :meeting_for, :last_name, :interests, :current_location, :pic, :books, :affiliations, :locale, :profile_url, :proxied_email, :email_hashes, :allowed_restrictions, :pic_with_logo, :pic_big_with_logo, :pic_small_with_logo, :pic_square_with_logo]
14
14
  STANDARD_FIELDS = [:uid, :first_name, :last_name, :name, :timezone, :birthday, :sex, :affiliations, :locale, :profile_url, :pic_square]
15
15
  populating_attr_accessor *FIELDS
16
16
  attr_reader :affiliations
@@ -245,17 +245,17 @@ module Facebooker
245
245
  #
246
246
  # This does not set profile actions, that should be done with profile_action=
247
247
  def profile_fbml=(markup)
248
- set_profile_fbml(markup, nil, nil)
248
+ set_profile_fbml(markup, nil, nil, nil)
249
249
  end
250
250
 
251
251
  ##
252
252
  # Set the mobile profile FBML
253
253
  def mobile_fbml=(markup)
254
- set_profile_fbml(nil, markup, nil)
254
+ set_profile_fbml(nil, markup, nil,nil)
255
255
  end
256
256
 
257
257
  def profile_action=(markup)
258
- set_profile_fbml(nil, nil, markup)
258
+ set_profile_fbml(nil, nil, markup,nil)
259
259
  end
260
260
 
261
261
  def profile_main=(markup)
@@ -377,6 +377,41 @@ module Facebooker
377
377
  ret
378
378
  end
379
379
  end
380
+
381
+ # Get a count of unconnected friends
382
+ def getUnconnectedFriendsCount
383
+ session.post("facebook.connect.getUnconnectedFriendsCount")
384
+ end
385
+
386
+
387
+ # Unregister an array of email hashes
388
+ def self.unregister(email_hashes)
389
+ Facebooker::Session.create.post("facebook.connect.unregisterUsers",:email_hashes=>email_hashes.to_json) do |ret|
390
+ ret.each do |hash|
391
+ email_hashes.delete(hash)
392
+ end
393
+ unless email_hashes.empty?
394
+ e=Facebooker::Session::UserUnRegistrationFailed.new
395
+ e.failed_users = email_hashes
396
+ raise e
397
+ end
398
+ ret
399
+ end
400
+ end
401
+
402
+ # unregister an array of email addresses
403
+ def self.unregister_emails(emails)
404
+ emails_hash = {}
405
+ emails.each {|e| emails_hash[hash_email(e)] = e}
406
+ begin
407
+ unregister(emails_hash.keys).collect {|r| emails_hash[r]}
408
+ rescue
409
+ # re-raise with emails instead of hashes.
410
+ e = Facebooker::Session::UserUnRegistrationFailed.new
411
+ e.failed_users = $!.failed_users.collect { |f| emails_hash[f] }
412
+ raise e
413
+ end
414
+ end
380
415
 
381
416
  def self.hash_email(email)
382
417
  email = email.downcase.strip
@@ -96,6 +96,18 @@ module Facebooker
96
96
  array_of_text_values(element("connect_registerUsers_response", data), "connect_registerUsers_response_elt")
97
97
  end
98
98
  end
99
+
100
+ class UnregisterUsers < Parser
101
+ def self.process(data)
102
+ array_of_text_values(element("connect_unregisterUsers_response", data), "connect_unregisterUsers_response_elt")
103
+ end
104
+ end
105
+
106
+ class GetUnconnectedFriendsCount < Parser
107
+ def self.process(data)
108
+ hash_or_value_for(element("connect_getUnconnectedFriendsCount_response",data)).to_i
109
+ end
110
+ end
99
111
 
100
112
  class GetSession < Parser#:nodoc:
101
113
  def self.process(data)
@@ -530,6 +542,8 @@ module Facebooker
530
542
  'facebook.auth.createToken' => CreateToken,
531
543
  'facebook.auth.getSession' => GetSession,
532
544
  'facebook.connect.registerUsers' => RegisterUsers,
545
+ 'facebook.connect.unregisterUsers' => UnregisterUsers,
546
+ 'facebook.connect.getUnconnectedFriendsCount' => GetUnconnectedFriendsCount,
533
547
  'facebook.users.getInfo' => UserInfo,
534
548
  'facebook.users.getStandardInfo' => UserStandardInfo,
535
549
  'facebook.users.setStatus' => SetStatus,
@@ -6,7 +6,7 @@ module Facebooker
6
6
  include Facebooker::Rails::ProfilePublisherExtensions
7
7
  def self.included(controller)
8
8
  controller.extend(ClassMethods)
9
- #controller.before_filter :set_adapter <-- security hole noted by vchu
9
+ controller.before_filter :set_adapter
10
10
  controller.before_filter :set_facebook_request_format
11
11
  controller.helper_attr :facebook_session_parameters
12
12
  controller.helper_method :request_comes_from_facebook?
@@ -45,6 +45,27 @@ module Facebooker
45
45
  @facebook_params ||= verified_facebook_params
46
46
  end
47
47
 
48
+ # Redirects the top window to the given url if the content is in an iframe, otherwise performs
49
+ # a normal redirect_to call.
50
+ def top_redirect_to(*args)
51
+ if request_is_facebook_iframe?
52
+ @redirect_url = url_for(*args)
53
+ render :layout => false, :inline => <<-HTML
54
+ <html><head>
55
+ <script type="text/javascript">
56
+ window.top.location.href = <%= @redirect_url.to_json -%>;
57
+ </script>
58
+ <noscript>
59
+ <meta http-equiv="refresh" content="0;url=<%=h @redirect_url %>" />
60
+ <meta http-equiv="window-target" content="_top" />
61
+ </noscript>
62
+ </head></html>
63
+ HTML
64
+ else
65
+ redirect_to(*args)
66
+ end
67
+ end
68
+
48
69
  def redirect_to(*args)
49
70
  if request_is_for_a_facebook_canvas? and !request_is_facebook_tab?
50
71
  render :text => fbml_redirect_tag(*args)
@@ -104,8 +125,7 @@ module Facebooker
104
125
 
105
126
  #returning gracefully if the cookies aren't set or have expired
106
127
  return unless parsed['session_key'] && parsed['user'] && parsed['expires'] && parsed['ss']
107
- return unless Time.at(parsed['expires'].to_f) > Time.now || (parsed['expires'] == "0")
108
-
128
+ return unless Time.at(parsed['expires'].to_s.to_f) > Time.now || (parsed['expires'] == "0")
109
129
  #if we have the unexpired cookies, we'll throw an exception if the sig doesn't verify
110
130
  verify_signature(parsed,cookies[Facebooker.api_key])
111
131
 
@@ -141,7 +161,7 @@ module Facebooker
141
161
  def create_new_facebook_session_and_redirect!
142
162
  session[:facebook_session] = new_facebook_session
143
163
  url_params = after_facebook_login_url.nil? ? {} : {:next=>after_facebook_login_url}
144
- redirect_to session[:facebook_session].login_url(url_params) unless @installation_required
164
+ top_redirect_to session[:facebook_session].login_url(url_params) unless @installation_required
145
165
  false
146
166
  end
147
167
 
@@ -219,8 +239,12 @@ module Facebooker
219
239
  !params["fb_sig_in_profile_tab"].blank?
220
240
  end
221
241
 
242
+ def request_is_facebook_iframe?
243
+ !params["fb_sig_in_iframe"].blank?
244
+ end
245
+
222
246
  def request_is_facebook_ajax?
223
- params["fb_sig_is_mockajax"]=="1" || params["fb_sig_is_ajax"]=="1"
247
+ params["fb_sig_is_mockajax"]=="1" || params["fb_sig_is_ajax"]=="1" || params["fb_sig_is_ajax"]==true || params["fb_sig_is_mockajax"]==true
224
248
  end
225
249
  def xml_http_request?
226
250
  request_is_facebook_ajax? || super
@@ -246,7 +270,7 @@ module Facebooker
246
270
  end
247
271
 
248
272
  def application_needs_permission(perm)
249
- redirect_to(facebook_session.permission_url(perm))
273
+ top_redirect_to(facebook_session.permission_url(perm))
250
274
  end
251
275
 
252
276
  def has_extended_permission?(perm)
@@ -266,14 +290,14 @@ module Facebooker
266
290
 
267
291
  def application_is_not_installed_by_facebook_user
268
292
  url_params = after_facebook_login_url.nil? ? {} : { :next => after_facebook_login_url }
269
- redirect_to session[:facebook_session].install_url(url_params)
293
+ top_redirect_to session[:facebook_session].install_url(url_params)
270
294
  end
271
295
 
272
296
  def set_facebook_request_format
273
297
  if request_is_facebook_ajax?
274
- params[:format] = 'fbjs'
275
- elsif request_comes_from_facebook?
276
- params[:format] = 'fbml'
298
+ request.format = :fbjs
299
+ elsif request_comes_from_facebook? && !request_is_facebook_iframe?
300
+ request.format = :fbml
277
301
  end
278
302
  end
279
303