Changeset 213740 in webkit


Ignore:
Timestamp:
Mar 10, 2017 5:01:19 PM (7 years ago)
Author:
Jon Davis
Message:

Switch back to the Twitter API for the Tweet widget
https://bugs.webkit.org/show_bug.cgi?id=168749

Reviewed by Lucas Forschler.

Updates the Twitter widget tile implementation to prefer the Twitter API to populate tweets
displayed through the widget. If the API fails for any reason, it falls back to using the
Tweet listener for updated tweets.

The Twitter API provides the benefit of embedding media and being able to display the full
URLs rather than Twitter-shortened URLs.

  • wp-content/plugins/tweet-listener.php:
  • wp-content/themes/webkit/style.css:

(.twitter-tile .tile-content):
(.twitter-tile.text-only):
(.twitter-tile .media):
(.twitter-tile img):

  • wp-content/themes/webkit/widgets/twitter.php:
Location:
trunk/Websites/webkit.org
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Websites/webkit.org/ChangeLog

    r213714 r213740  
     12017-03-10  Jon Davis  <jond@apple.com>
     2
     3        Switch back to the Twitter API for the Tweet widget
     4        https://bugs.webkit.org/show_bug.cgi?id=168749
     5
     6        Reviewed by Lucas Forschler.
     7       
     8        Updates the Twitter widget tile implementation to prefer the Twitter API to populate tweets
     9        displayed through the widget. If the API fails for any reason, it falls back to using the
     10        Tweet listener for updated tweets.
     11       
     12        The Twitter API provides the benefit of embedding media and being able to display the full
     13        URLs rather than Twitter-shortened URLs.
     14
     15        * wp-content/plugins/tweet-listener.php:
     16        * wp-content/themes/webkit/style.css:
     17        (.twitter-tile .tile-content):
     18        (.twitter-tile.text-only):
     19        (.twitter-tile .media):
     20        (.twitter-tile img):
     21        * wp-content/themes/webkit/widgets/twitter.php:
     22
    1232017-03-04  Filip Pizlo  <fpizlo@apple.com>
    224
  • trunk/Websites/webkit.org/wp-content/plugins/tweet-listener.php

    r199491 r213740  
    1313
    1414    private static $object = null;
    15    
     15
    1616    const AUTH_TOKEN = TWITTER_LISTENER_AUTH;
    1717    const DATA_KEY = 'recent_tweet';
     
    2929
    3030    public function listen() {
    31        
     31
     32        if (!isset($_POST['token']) || $_POST['token'] != TWITTER_LISTENER_AUTH)
     33            wp_die();
     34
    3235        $defaults = array(
    33             'text' => '', 
     36            'text' => '',
    3437            'username' => '@webkit',
    3538            'link' => '',
     
    4245        wp_die();
    4346    }
    44    
     47
    4548    public function tweet() {
    4649        $data = (object)get_option(self::DATA_KEY);
    47        
     50
    4851        // Setup compatible Tweet structure
    4952
     
    6568            }
    6669        }
    67        
     70
    6871        return $Tweet;
    6972    }
  • trunk/Websites/webkit.org/wp-content/themes/webkit/style.css

    r203410 r213740  
    654654    box-sizing: border-box;
    655655    font-size: 2rem;
     656    text-align: center;
    656657}
    657658
     
    660661    display: flex;
    661662    justify-content: center;
     663    text-align: left;
     664}
     665
     666.twitter-tile .media {
     667    text-align: center;
    662668}
    663669
     
    671677
    672678.twitter-tile img {
    673     width: 100%;
     679    display: inline-block;
     680    width: auto;
    674681    height: auto;
     682    max-width: 100%;
    675683    max-height: 256px;
    676684}
     
    700708    margin: 0 1.3rem;
    701709}
     710
    702711.twitter-controls a {
    703712    opacity: 0.66;
  • trunk/Websites/webkit.org/wp-content/themes/webkit/widgets/twitter.php

    r199074 r213740  
    1212
    1313    const CACHEKEY = 'webkit_twitter_feed';
     14    const ENDPOINT = 'https://api.twitter.com/1.1/statuses/user_timeline.json';
    1415
    1516    function __construct() {
     
    3132            return $this->follow_markup($options);
    3233
    33         // Show "Follow @webkit" instead of tweet for blog URLs
    34         if ( ! empty($Tweet->entities)
    35                 && ! empty($Tweet->entities->urls)
    36                 && count($Tweet->entities->urls) == 1
    37                 && preg_match('!webkit.org/blog/\d+/!', $Tweet->entities->urls[0]->expanded_url) == 1)
    38             return $this->follow_markup($options);
    39 
    4034        $classes = array('tile', 'third-tile', 'twitter-tile');
    41 
    4235        $text = (string)$options['text'];
     36        $link = "https://twitter.com/webkit/status/$Tweet->id";
    4337
    4438        if ( ! empty($Tweet->text) )
    4539            $text = $Tweet->text;
    46 
    47         if ( ! empty($options['url']) )
    48             $url = (string)$options['url'];
    4940
    5041        // Expand URLs
     
    5243            $expanded = '<a href="' . esc_url($entry->expanded_url) . '">'
    5344                                 . $entry->display_url . '</a>';
     45
     46            // Don't show webkit.org links, just change the tile to use the link in the tweet
     47            if ( preg_match('!webkit.org/.+?!', $entry->expanded_url) == 1 ) {
     48                $expanded = '';
     49                $link = $entry->expanded_url;
     50            }
     51
    5452            $text = str_replace($entry->url, $expanded, $text);
    5553        }
    5654
    5755        $text = preg_replace('/RT @[^:]+:\s+/', '', $text, 1);
     56        if ( ! ( empty($Tweet->entities) || empty($Tweet->entities->media) ) ) {
     57            $Image = $Tweet->entities->media[0];
    5858
    59         if ( empty($Tweet->entities) || empty($Tweet->entities->media) ) {
    60 
    61             $Image = $Tweet->entities->media[0];
    6259            if ( empty($Image) ) $classes[] = 'text-only';
    6360
     
    6663                $text = str_replace($entry->url, '', $text);
    6764            }
     65        } else {
     66            $classes[] = 'text-only';
    6867        }
    6968
    7069        ?>
    7170        <div class="<?php echo esc_attr(join(' ', $classes)); ?>">
    72             <a href="http://twitter.com/webkit/status/<?php echo esc_attr($Tweet->id); ?>" class="tile-link">Clickable link to tweet</a>
     71            <a href="<?php echo esc_url($link); ?>" class="tile-link">Clickable link to tweet</a>
    7372            <div class="tile-content">
    7473            <?php if ( ! empty($Image) ): ?>
     
    8079            </div>
    8180            <ul class="twitter-controls">
    82                 <li><a href="https://twitter.com/webkit" target="twitter-modal"><span class="twitter-icon">Twitter</span> @webkit</a></li>
     81                <li><a href="https://twitter.com/webkit" target="twitter-modal"><span class="twitter-icon">Twitter</span>@webkit</a></li>
    8382                <li><a href="https://twitter.com/intent/tweet?in-reply-to=<?php echo esc_attr($Tweet->id); ?>" class="twitter-icon reply-icon" target="twitter-modal">Reply</a></li>
    8483                <li><a href="https://twitter.com/intent/retweet?tweet_id=<?php echo esc_attr($Tweet->id); ?>" class="twitter-icon retweet-icon" target="twitter-modal">Retweet</a></li>
     
    112111    function tweet () {
    113112
    114         // Prefer pushed tweet
    115         if ( class_exists('TweetListener') ) {
    116             $TweetListener = TweetListener::object();
    117             return $TweetListener->tweet();
    118         }
    119 
    120         // Poll for tweet
    121113        if ( false !== ( $cached = get_transient(self::CACHEKEY) ) )
    122114            return json_decode($cached);
    123115
    124         $endpoint = 'https://api.twitter.com/1.1/statuses/user_timeline.json';
     116        // Get pushed Tweet as a fallback
     117        $pushedTweet = false;
     118        if ( class_exists('TweetListener') ) {
     119            $TweetListener = TweetListener::object();
     120            $pushedTweet = $TweetListener->tweet();
     121        }
     122
     123        // Connect to Twitter API
    125124        $parameters = array();
    126125        $options = array(
     
    128127        );
    129128
    130         $oauth_consumer_key = 'ypSvRp37vmyt3ldMPhs0e62c9';
    131         $oauth_consumer_key_secret = 'mLuYD3AjUehUZKOgQIICA5Na69te45aSJTkdIDTGSg4cfHd6Lz';
    132         $oauth_token = '14315023-7pHbcI5bk2QZhNiHR9uFudaksBzMPubEuOEmYj7YQ';
    133         $oauth_token_secret = '0K9T9znxG4S9PUGunYZ5LwyKL9AR6v3eAXp6WKY2oi7Bg';
     129        list($oauth_consumer_key, $oauth_consumer_key_secret) = explode(':', TWITTER_CONSUMER_KEY);
     130        list($oauth_token, $oauth_token_secret) = explode(':', TWITTER_OAUTH_TOKEN);
    134131        $oauth_timestamp = time();
    135132        $oauth_nonce = sha1(rand() . $oauth_timestamp);
     
    137134        $fields = array(
    138135            'oauth_consumer_key' => $oauth_consumer_key,
    139             'oauth_nonce' => sha1(rand() . time()),
     136            'oauth_nonce' => $oauth_nonce,
    140137            'oauth_signature_method' => 'HMAC-SHA1',
    141             'oauth_timestamp' => time(),
     138            'oauth_timestamp' => $oauth_timestamp,
    142139            'oauth_token' => $oauth_token,
    143140            'oauth_version' => '1.0',
     
    145142        $fields = array_merge($parameters, $fields);
    146143
    147         $base = array(
    148             'GET', $endpoint, http_build_query($fields, '', '&')
    149         );
    150         $base = join('&', array_map('rawurlencode', $base));
     144        $requestParts = array('GET', self::ENDPOINT, http_build_query($fields, '', '&'));
     145        $request = join('&', array_map('rawurlencode', $requestParts));
    151146
     147        $authkeys = array($oauth_consumer_key_secret, $oauth_token_secret);
     148        $auth = join('&', array_map('rawurlencode', $authkeys));
    152149
    153         $key = array(
    154             $oauth_consumer_key_secret, $oauth_token_secret
    155         );
    156         $key = join('&', array_map('rawurlencode', $key));
    157 
    158         $signature = base64_encode( hash_hmac('sha1', $base, $key, true) );
     150        $signature = base64_encode( hash_hmac('sha1', $request, $auth, true) );
    159151
    160152        $oauth = array(
     
    167159            'oauth_version' => '1.0',
    168160        );
     161
     162        // Wrap values in double-quotes.
    169163        $oauth = array_map(create_function('$h','return "\"$h\"";'), $oauth);
    170 
    171164        $oauth = http_build_query($oauth, '', ', ');
    172165        $oauth = str_replace('%22', '"', $oauth);
     
    178171        $options['headers'] = $headers;
    179172
    180         $response = wp_remote_get($endpoint, $options);
     173        $response = wp_remote_get(self::ENDPOINT, $options);
    181174
    182175        if ( is_a($response, 'WP_Error') )
    183             return false;
     176            return $pushedTweet;
    184177
    185178        if ( 200 == $response['response']['code'] && ! empty($response['body']) ) {
     
    190183        }
    191184
    192         return false;
     185        return $pushedTweet;
     186    }
     187
     188    function isWebKitLink ($Tweet) {
     189        return ( ! empty($Tweet->entities->urls[0]->expanded_url)
     190                && preg_match('!webkit.org/.+?!', $Tweet->entities->urls[0]->expanded_url) == 1 );
    193191    }
    194192
Note: See TracChangeset for help on using the changeset viewer.