fu: Close-up of Fu, bringing a scoop of water to her mouth (Default)
fu ([personal profile] fu) wrote in [site community profile] changelog2011-01-13 04:23 am

[dw-free] style=* links on control strip broken when control strip is added using JS

[commit: http://hg.dwscoalition.org/dw-free/rev/4ce458a16452]

http://bugs.dwscoalition.org/show_bug.cgi?id=3380

Fix style=* URLs when called from a control strip that was injected using
javascript (when not supported natively by the style)

Patch by [personal profile] fu.

Files modified:
  • cgi-bin/weblib.pl
  • htdocs/tools/endpoints/controlstrip.bml
--------------------------------------------------------------------------------
diff -r e831b210dd84 -r 4ce458a16452 cgi-bin/weblib.pl
--- a/cgi-bin/weblib.pl	Thu Jan 13 12:18:19 2011 +0800
+++ b/cgi-bin/weblib.pl	Thu Jan 13 12:23:24 2011 +0800
@@ -2685,7 +2685,6 @@ sub control_strip
 {
     my %opts = @_;
     my $user = delete $opts{user};
-    my $baseuri = delete $opts{baseuri};
 
     my $journal = LJ::load_user($user);
     my $show_strip = 1;
@@ -2696,12 +2695,27 @@ sub control_strip
     my $remote = LJ::get_remote();
 
     my $r = DW::Request->get;
-    my $args = $baseuri ? delete $opts{args} : $r->query_string; # use passed in args if we have a passed in location
+    my $passed_in_location = $opts{host} && $opts{uri} ? 1 : 0;
+    my $host = delete $opts{host} || $r->header_in('Host');
+    my $uri = delete $opts{uri} || $r->uri;
+
+    my $args;
+    my $argshash = {};
+    # we need to pass in location explicitly when creating a control strip using JS
+    if ( $passed_in_location ) {
+        $args = delete $opts{args};
+        LJ::decode_url_string( $args, $argshash );
+    } else {
+        $args = $r->query_string;
+        $argshash = $r->get_args;
+    }
+
     my $view = delete $opts{view} || $r->note( 'view' );
 
-    my $uri = $baseuri ? "http://$baseuri" : "http://" . $r->header_in('Host') . $r->uri;
-    $uri .= $args ? "?$args" : "";
-    my $euri = LJ::eurl($uri);
+    my $baseuri = "http://$host$uri";
+
+    $baseuri .= $args ? "?$args" : "";
+    my $euri = LJ::eurl( $baseuri );
     my $create_link = LJ::Hooks::run_hook("override_create_link_on_navstrip", $journal) || "<a href='$LJ::SITEROOT/create'>" . BML::ml('web.controlstrip.links.create', {'sitename' => $LJ::SITENAMESHORT}) . "</a>";
 
     # Build up some common links
@@ -3070,30 +3084,32 @@ LOGIN_BAR
 
     # a quick little routine to use when cycling through the options
     # to create the style links for the nav bar
-    sub make_style_link {
-        return create_url( undef,
+    my $make_style_link = sub {
+        return create_url( $uri,
+            host => $host,
+            cur_args => $argshash,
             # change the style arg
             'args' => { 'style' => $_[0] },
             # keep any other existing arguments
             'keep_args' => 1,
         );
-    }
+    };
 
     # cycle through all possibilities, add the valid ones
     foreach my $view_type qw( mine site light original ) {
         # only want to offer this option if user is logged in and it's not their own journal, since
         # original will take care of that
         if ( $view_type eq "mine" and $current_style ne $view_type and $remote and not $remote->equals( $journal ) ) {
-            push @view_options, "<a href='" . make_style_link( $view_type ) . "'>" .
+            push @view_options, "<a href='" . $make_style_link->( $view_type ) . "'>" .
                 LJ::Lang::ml( 'web.controlstrip.reloadpage.mystyle2' ) . "</a>";
         } elsif ( $view_type eq "site" and $current_style ne $view_type and $view eq "entry" ) {
-            push @view_options, "<a href='" . make_style_link( $view_type ) . "'>" .
+            push @view_options, "<a href='" . $make_style_link->( $view_type ) . "'>" .
                 LJ::Lang::ml( 'web.controlstrip.reloadpage.sitestyle' ) . "</a>";
         } elsif ( $view_type eq "light" and $current_style ne $view_type ) {
-            push @view_options, "<a href='" . make_style_link( $view_type ) . "'>" .
+            push @view_options, "<a href='" . $make_style_link->( $view_type ) . "'>" .
                 LJ::Lang::ml( 'web.controlstrip.reloadpage.lightstyle2' ) . "</a>";
         } elsif ( $view_type eq "original" and $current_style ne $view_type ) {
-            push @view_options, "<a href='" . make_style_link( $view_type ) . "'>" .
+            push @view_options, "<a href='" . $make_style_link->( $view_type ) . "'>" .
                 LJ::Lang::ml( 'web.controlstrip.reloadpage.origstyle2' ) . "</a>";
         }
     }
@@ -3116,7 +3132,8 @@ sub control_strip_js_inject
     my $ret;
 
     my $r = DW::Request->get;
-    my $baseuri = $r->header_in( 'Host' ) . $r->uri;
+    my $host = $r->header_in( 'Host' );
+    my $uri = $r->uri;
     my $args = LJ::eurl( $r->query_string ) || '';
     my $view = $r->note( 'view' ) || '';
 
@@ -3125,7 +3142,7 @@ sub control_strip_js_inject
     function controlstrip_init() {
         if (! \$('lj_controlstrip') ){
             HTTPReq.getJSON({
-              url: "/$user/__rpc_controlstrip?user=$user&baseuri=$baseuri&args=$args&view=$view",
+              url: "/$user/__rpc_controlstrip?user=$user&host=$host&uri=$uri&args=$args&view=$view",
               onData: function (data) {
                   var body = document.getElementsByTagName("body")[0];
                   var div = document.createElement("div");
diff -r e831b210dd84 -r 4ce458a16452 htdocs/tools/endpoints/controlstrip.bml
--- a/htdocs/tools/endpoints/controlstrip.bml	Thu Jan 13 12:18:19 2011 +0800
+++ b/htdocs/tools/endpoints/controlstrip.bml	Thu Jan 13 12:23:24 2011 +0800
@@ -23,7 +23,7 @@ _c?>
         unless (defined LJ::get_active_journal()) {
             LJ::set_active_journal(LJ::load_user($user));
         }
-        $control_strip = LJ::control_strip( user => $user, baseuri => $GET{baseuri}, args => $GET{args}, view => $GET{view} );
+        $control_strip = LJ::control_strip( user => $user, host => $GET{host}, uri => $GET{uri}, args => $GET{args}, view => $GET{view} );
     }
 
     sleep 1 if $LJ::IS_DEV_SERVER;
--------------------------------------------------------------------------------

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org